最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JAVA簡(jiǎn)單選擇排序算法原理及實(shí)現(xiàn)

 更新時(shí)間:2014年01月19日 13:27:41   作者:  
選擇排序(Selection Sort )分為兩種 簡(jiǎn)單選擇排序(Simple Selection Sort) 和樹(shù)形選擇排序

簡(jiǎn)單選擇排序:(選出最小值,放在第一位,然后第一位向后推移,如此循環(huán))第一位與后面每一個(gè)逐個(gè)比較,每次都使最小的置頂,第一位向后推進(jìn)(即剛選定的第一位是最小值,不再參與比較,比較次數(shù)減1)

復(fù)雜度: 所需進(jìn)行記錄移動(dòng)的操作次數(shù)較少 0--3(n-1) ,無(wú)論記錄的初始排列如何,所需的關(guān)鍵字間的比較次數(shù)相同,均為n(n-1)/2,總的時(shí)間復(fù)雜度為O(n2);
空間復(fù)雜度 O(1)

算法改進(jìn):每次對(duì)比,都是為了將最小的值放到第一位,所以可以一比到底,找出最小值,直接放到第一位,省去無(wú)意義的調(diào)換移動(dòng)操作。也可以換一個(gè)方向,最后一位與前面每一個(gè)比較,每次使最大值沉底,最后一位向前推進(jìn)。

JAVA源代碼:

復(fù)制代碼 代碼如下:

 public static void selectSort(Date[] days) {
  int min;
  Date temp;
  for (int i = 0; i < days.length; i++) {
   min = i;
   for (int j = min + 1; j < days.length; j++) {
    if (days[min].compare(days[j]) > 0) {
     min = j;
    }
   }
   if (min != i) {
    temp = days[i];
    days[i] = days[min];
    days[min] = temp;
   }
  }
 }
class Date {
 int year, month, day;

 Date(int y, int m, int d) {
  year = y;
  month = m;
  day = d;
 }

 public int compare(Date date) {
  return year > date.year ? 1 : year < date.year ? -1
    : month > date.month ? 1 : month < date.month ? -1
      : day > date.day ? 1 : day < date.day ? -1 : 0;
 }

 public void print() {
  System.out.println(year + " " + month + " " + day);
 }
}


  簡(jiǎn)單選擇排序(Simple Selection Sort):

  簡(jiǎn)單選擇排序類似于冒泡排序(Bubble Sort) ,每次都會(huì)在剩下的元素集合中選擇出一個(gè)最值出來(lái)填充到當(dāng)前位置。唯一的區(qū)別是,冒泡排序在每次發(fā)現(xiàn)比當(dāng)前值小于(或大于)時(shí),都會(huì)交換元素的位置, 而 簡(jiǎn)單選擇排序是選擇剩余元素中的最值和當(dāng)前位置交換數(shù)據(jù)。

  比如對(duì)于元素集合R={37, 40, 38, 42, 461, 5,  7, 9, 12}

  在第一趟排序中:37直接和5交換, 形成新的序列 R1={5,40,38,42,461,37,7,9,12}
  在第二趟排序中:40直接和7交換, 形成新的序列 R2={5,7,38,42,461,37,40,9,12}

  以此類推,直到最后一個(gè)元素(注意:在第二趟排序中,38比42小,但是他們并沒(méi)有交換數(shù)據(jù))。

  以下是簡(jiǎn)單選擇排序的一個(gè)Java實(shí)現(xiàn)版本:

復(fù)制代碼 代碼如下:

  public static void selectionSort(int[] data) {
  if (data == null || data.length <= 1)
  return;
  int i, j, value, minPos, len = data.length;
  int outer = len - 1, tmp;
  for (i = 0; i < outer; i++) {
  value = data[i];
  minPos = -1;
  for (j = i + 1; j < len; j++) {
  if (data[j] < value) {
  minPos = j;
  value = data[j];
  }
  }
  if (minPos != -1) {
  tmp = data[i];
  data[i] = value;
  data[minPos] = tmp;
  }
  //            for (int k = 0; k < len; k++) {
  //                System.out.print(data[k] + " , ");
  //            }
  //            System.out.println();
  }
  }
  public static void main(String[] args) {
  int[] coll = {
  37, 40, 38, 42, 461, 5,  7, 9, 12
  };
  selectionSort(coll);
  for (int i = 0; i < coll.length; i++) {
  System.out.print(coll[i] + " , ");
  }
  }

  樹(shù)選擇排序(Tree Selection Sort)
  樹(shù)選擇排序算法相對(duì)于簡(jiǎn)單選擇排序來(lái)說(shuō)是典型的以空間換時(shí)間的算法。其思想是對(duì)待排序的 N 個(gè)元素 , 構(gòu)造出相對(duì)較小的 (n+1)/2個(gè)數(shù),然后再構(gòu)造出相對(duì)較小的[n+1]/4個(gè)數(shù),直到只有一個(gè)元素為止。構(gòu)造成一個(gè)完全二叉樹(shù)。
  排序的時(shí)候,那個(gè)元素就是最小的,取出該最小元素,將該元素替換為"最大值",再調(diào)整完全二叉樹(shù)。
下面是樹(shù)形選擇排序的一個(gè)Java實(shí)現(xiàn)版:

復(fù)制代碼 代碼如下:

  public static void treeSelectionSort(int[] data) {
  if (data == null || data.length <= 1)
  return;
  int len = data.length , low = 0 , i , j;
  // add Auxiliary Space
  int[] tmp = new int[2*len -1];
  int tSize = tmp.length;
  //construct a tree
  for(i =len-1 , j=tmp.length-1;i >=0 ;i--,j--){
  tmp[j]=data[i];
  }
  for(i = tSize -1 ; i > 0 ; i-=2){
  tmp[(i-1)/2] = tmp[i] > tmp[i-1]? tmp[i-1]:tmp[i];
  }
  //end
  //remove the minimum node.
  while(low < len){
  data[low++] = tmp[0];
  for(j=tSize-1;tmp[j]!=tmp[0];j--);
  tmp[j] = Integer.MAX_VALUE;
  while(j > 0){
  if(j%2 == 0){  //如果是右節(jié)點(diǎn)
  tmp[(j-1)/2] = tmp[j] > tmp[j-1]?tmp[j-1]:tmp[j];
  j = (j-1)/2;
  }else{  //如果是左節(jié)點(diǎn)
  tmp[j/2]=tmp[j] > tmp[j+1]? tmp[j+1]:tmp[j];
  j = j/2;
  }
  }
  }
  }

  在構(gòu)造完全二叉樹(shù)的時(shí)候?qū)?N 個(gè)元素的集合, 需要 2*N -1 個(gè)輔助空間。
  代碼:

復(fù)制代碼 代碼如下:

  while(j > 0){
  if(j%2 == 0){  //如果是右節(jié)點(diǎn)
  tmp[(j-1)/2] = tmp[j] > tmp[j-1]?tmp[j-1]:tmp[j];
  j = (j-1)/2;
  }else{  //如果是左節(jié)點(diǎn)
  tmp[j/2]=tmp[j] > tmp[j+1]? tmp[j+1]:tmp[j];
  j = j/2;
  }
  }

  則實(shí)現(xiàn)遞歸的構(gòu)造新集合中的最小值。

相關(guān)文章

  • Mybatis接口Mapper內(nèi)的方法為啥不能重載嗎

    Mybatis接口Mapper內(nèi)的方法為啥不能重載嗎

    這篇文章主要介紹了Mybatis接口Mapper內(nèi)的方法為啥不能重載嗎,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java內(nèi)存溢出的幾個(gè)區(qū)域總結(jié)(注意避坑!)

    Java內(nèi)存溢出的幾個(gè)區(qū)域總結(jié)(注意避坑!)

    內(nèi)存溢出是指應(yīng)用系統(tǒng)中存在無(wú)法回收的內(nèi)存或使用的內(nèi)存過(guò)多,最終使得程序運(yùn)行要用到的內(nèi)存大于虛擬機(jī)能提供的最大內(nèi)存,下面這篇文章主要給大家介紹了關(guān)于Java內(nèi)存溢出的幾個(gè)區(qū)域,總結(jié)出來(lái)給大家提醒注意避坑,需要的朋友可以參考下
    2022-11-11
  • Java通過(guò)Freemarker模板實(shí)現(xiàn)生成Word文件

    Java通過(guò)Freemarker模板實(shí)現(xiàn)生成Word文件

    FreeMarker是一款模板引擎: 即一種基于模板和要改變的數(shù)據(jù), 并用來(lái)生成輸出文本的通用工具。本文將根據(jù)Freemarker模板實(shí)現(xiàn)生成Word文件,需要的可以參考一下
    2022-09-09
  • spring自定義一個(gè)簡(jiǎn)單的Starter啟動(dòng)器

    spring自定義一個(gè)簡(jiǎn)單的Starter啟動(dòng)器

    這篇文章主要介紹了spring自定義一個(gè)簡(jiǎn)單的Starter啟動(dòng)器,一個(gè) starter其實(shí)就是對(duì)一個(gè)功能的集成封裝,然后對(duì)外提供一個(gè)依賴,讓業(yè)務(wù)去使用,像我們熟悉的 Redis,mongo,mybatis 等均屬于,需要的朋友可以參考下
    2023-07-07
  • ElasticSearch學(xué)習(xí)之ES Mapping實(shí)戰(zhàn)示例

    ElasticSearch學(xué)習(xí)之ES Mapping實(shí)戰(zhàn)示例

    這篇文章主要為大家介紹了ElasticSearch學(xué)習(xí)之ES Mapping實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • java安全停止線程的方法詳解

    java安全停止線程的方法詳解

    這篇文章主要介紹了java安全停止線程的方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • spring中12種@Transactional的失效場(chǎng)景(小結(jié))

    spring中12種@Transactional的失效場(chǎng)景(小結(jié))

    日常我們進(jìn)行業(yè)務(wù)開(kāi)發(fā)時(shí),基本上使用的都是聲明式事務(wù),即為使用@Transactional注解的方式,本文主要介紹了spring中12種@Transactional的失效場(chǎng)景,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java設(shè)計(jì)模式之適配器模式的示例詳解

    Java設(shè)計(jì)模式之適配器模式的示例詳解

    適配器模式,即將某個(gè)類的接口轉(zhuǎn)換成客戶端期望的另一個(gè)接口的表示,主要目的是實(shí)現(xiàn)兼容性,讓原本因?yàn)榻涌诓黄ヅ洌瑳](méi)辦法一起工作的兩個(gè)類,可以協(xié)同工作。本文將通過(guò)示例詳細(xì)介紹適配器模式,需要的可以參考一下
    2022-08-08
  • Java集合WeakHashMap源碼分析

    Java集合WeakHashMap源碼分析

    這篇文章主要介紹了Java集合WeakHashMap源碼分析,和HashMap一樣,WeakHashMap 也是一個(gè)散列表,它存儲(chǔ)的內(nèi)容也是鍵值對(duì)(key-value)映射,而且鍵和值都可以是null,需要的朋友可以參考下
    2023-09-09
  • mybatis實(shí)現(xiàn)批量插入并返回主鍵(xml和注解兩種方法)

    mybatis實(shí)現(xiàn)批量插入并返回主鍵(xml和注解兩種方法)

    這篇文章主要介紹了mybatis實(shí)現(xiàn)批量插入并返回主鍵(xml和注解兩種方法),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評(píng)論

麻栗坡县| 潍坊市| 锡林郭勒盟| 沙雅县| 新干县| 惠州市| 察哈| 贡山| 江川县| 安化县| 绵阳市| 阿克陶县| 滦平县| 宝兴县| 许昌县| 敖汉旗| 崇文区| 新竹市| 卫辉市| 嘉祥县| 无为县| 湘潭县| 绥芬河市| 逊克县| 三穗县| 枣强县| 开化县| 耒阳市| 班戈县| 贵南县| 靖州| 宁蒗| 左权县| 北京市| 宕昌县| 阜新市| 屏东县| 宣汉县| 福州市| 新巴尔虎左旗| 陆河县|