一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - JAVA簡單選擇排序算法原理及實現

JAVA簡單選擇排序算法原理及實現

2019-11-01 14:17java教程網 JAVA教程

選擇排序(Selection Sort )分為兩種 簡單選擇排序(Simple Selection Sort) 和樹形選擇排序

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

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

算法改進:每次對比,都是為了將最小的值放到第一位,所以可以一比到底,找出最小值,直接放到第一位,省去無意義的調換移動操作。也可以換一個方向,最后一位與前面每一個比較,每次使最大值沉底,最后一位向前推進。

JAVA源代碼:

 

復制代碼代碼如下:


 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);
 }
}

 

 

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

  簡單選擇排序類似于冒泡排序(Bubble Sort) ,每次都會在剩下的元素集合中選擇出一個最值出來填充到當前位置。唯一的區別是,冒泡排序在每次發現比當前值小于(或大于)時,都會交換元素的位置, 而 簡單選擇排序是選擇剩余元素中的最值和當前位置交換數據。

  比如對于元素集合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}

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

  以下是簡單選擇排序的一個Java實現版本:

 

復制代碼代碼如下:

  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] + " , ");
  }
  }

 

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

 

復制代碼代碼如下:

  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){  //如果是右節點
  tmp[(j-1)/2] = tmp[j] > tmp[j-1]?tmp[j-1]:tmp[j];
  j = (j-1)/2;
  }else{  //如果是左節點
  tmp[j/2]=tmp[j] > tmp[j+1]? tmp[j+1]:tmp[j];
  j = j/2;
  }
  }
  }
  }

 

  在構造完全二叉樹的時候對 N 個元素的集合, 需要 2*N -1 個輔助空間。
  代碼:

復制代碼代碼如下:

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


  則實現遞歸的構造新集合中的最小值。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 人人九九 | 国产美女屁股直流白浆视频无遮挡 | 国产成人精视频在线观看免费 | 欧美猛男同志同性video | 美女禁区视频免费观看精选 | 国内精品视频一区二区三区八戒 | 国产高清自拍 | 美日韩在线观看 | 色吧| 拍拍叫痛的无挡视频免费 | 国产91区 | 国产免费一区二区三区免费视频 | 午夜精品久视频在线观看 | 翁熄性放纵交换300章 | 男生操女生的漫画 | 九9热这里只有真品 | 亚洲人成在线观看一区二区 | 久久精品视频91 | www免费插插视频 | 亚洲啊v| 精品国产美女福利在线 | 欧美亚洲天堂 | 亚洲成人黄色 | 2021国产精品视频 | 欧美男人天堂 | 精品一区二区三区在线播放 | 为什么丈夫插我我却喜欢被打着插 | 欧美精品一区视频 | 手机能看的黄色网站 | 亚洲一卡2卡4卡5卡6卡残暴在线 | 福利久草 | 四虎音影| 国产99视频精品免视看7 | 热九九精品 | 精品一区二区高清在线观看 | 久久亚洲成a人片 | 精品一区二区三区 不卡高清 | 高清国产在线观看 | 免费一级特黄特色大片在线观看 | 国产乱子伦在线观看不卡 | 99在线免费视频 |