Java實現直接插入排序和折半插入排序演算法樣本_java

來源:互聯網
上載者:User

直接插入排序​
1 排序思想:

將待排序的記錄Ri插入到已經排好序的記錄R1,R2,……,R(N-1)中。

對於一個隨機序列而言,就是從第二個元素開始,依次將這個元素插入到它之前的元素中的相應位置。它之前的元素已經排好序。

第1次排序:將第2個元素插入到前邊的有序列表(此時前邊只有一個元素,當然是有序的),之後,這個序列的前2個元素就是有序的了。
第2次排序:將第3個元素插入到前邊長度為2的有序列表,使得前2個元素是有序的。
以此類推,直到將第N個元素插入到前面長度為(N-1)的有序列表中。

2 演算法實現:

// 直接插入排序void straight_insert_sort(int num[], int len){ int i,j,key; for(j=1;j<len;j++){  key=num[j];  i=j-1;  while(i>=0&&num[i]>key){   num[i+1]=num[i];   i--;  }  num[i+1]=key; }}

3 效能分析:

3.1 空間複雜度:如上代碼,使用了一個輔助單元key,空間複雜度為O(1)

3.2 時間複雜度:

3.2.1 最好情況:待排序記錄已經是有序的,則一趟排序,關鍵字比較1次,記錄移動2次。則整個過程

比較次數為

記錄移動次數為

時間複雜度O(n)

3.2.2 最壞情況:待排序記錄已經是逆序的,則一趟排序,關鍵字比較次數i次(從i-1到0),記錄移動(i+2)次。整個過程

比較次數為

記錄移動次數為

時間複雜度O(n^2)

3.2.3 平均時間複雜度:O(n^2)

3.3 穩定性:穩定

折半插入排序
1 排序思想:

直接排序的基礎上,將待排序的記錄Ri插入到已經排好序的記錄R1,R2,……,R(N-1)中,由於記錄R1,R2,……,R(N-1)已經排好序,所以在尋找插入位置時可採用“折半尋找”。

2 演算法實現:

// 折半插入排序void binary_insert_sort(int num[], int len){ int i,j,key,low,high,mid; for(i=1;i<len;i++){  key=num[i];  low=0;  high=i-1;  mid=(low+high)/2;  // 尋找插入點,最終插入點在low  while(low<=high){   if(key<num[mid])    high=mid-1;   else     low=mid+1;   mid=(low+high)/2;  }  // 移動記錄  for(j=i;j>low;j--){   num[j]=num[j-1];  }  // 插入記錄  num[low]=key; }}

3 效能分析:

3.1 空間複雜度:如上代碼,使用了一個輔助單元key,空間複雜度為O(1)

3.2 時間複雜度:雖然折半尋找減少了記錄比較次數,但沒有減少移動次數,因此時間複雜度同直接尋找演算法。

3.2.1 最好情況:時間複雜度O(n)

3.2.2 最壞情況:時間複雜度O(n^2)

3.2.3 平均時間複雜度:O(n^2)

3.3 穩定性:穩定

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.