排序演算法(1) —— 直接插入排序及其改進

來源:互聯網
上載者:User

參考文章: http://blog.csdn.net/yexinghai/archive/2009/10/10/4649923.aspx

該文章對插入排序的演算法,是錯誤的。

 

 

直接插入排序

原理:將數組分為無序區和有序區兩個區,然後不斷將無序區的第一個元素按大小順序插入到有序區中去,最終將所有無序區元素都移動到有序區完成排序。

要點:設立哨兵,作為臨時儲存和判斷數組邊界之用。

實現:(我重新寫了一個)

#include <iostream><br />using namespace std;<br />void InsertSort(int num[], int length)<br />{<br />int i, j, k, tn;<br />for (i = 1; i < length; i++)<br />{<br />k = i;<br />j = k - 1;<br />while (num[k] < num[j])<br />{<br />tn = num[k];<br />num[k] = num[j];<br />num[j] = tn;<br />if (j > 0)<br />{<br />k = j--;<br />}<br />}<br />}<br />}<br />int main()<br />{<br />int num[6] = {2, -8, 9, 3, -99, 7};<br />InsertSort(num, 6);</p><p>for (int i = 0; i < 6; i++)<br />{<br />cout<<num[i]<<" ";<br />}<br />return 0;<br />} 

 

我們可以看到將無序地區的一個元素插入一個有序的時候,上述代碼是一個一個比較,並且移位。將一個元素插入一個有序的序列,是否可以利用二分尋找最佳化呢。於是,我又對上述代碼進行了改進:

#include <iostream><br />using namespace std;<br />int findIndex(int num[], int length, int val)<br />{<br />int left = 0;<br />int right = length - 1;<br />int middle, lower;<br />do<br />{<br />middle = (left + right) / 2;<br />if (val > num[middle])<br />{<br />left = ++middle;<br />}<br />else<br />{<br />lower = middle - 1;<br />if (lower < 0)<br />{<br />lower = 0;<br />break;<br />}<br />if (num[lower] <= val)<br />{<br />break;<br />}<br />right = lower;<br />}<br />} while (left <= right);<br />return middle;<br />}<br />void InsertSort(int num[], int length)<br />{<br />int i, index, tn;<br />for (i = 1; i < length; i++)<br />{<br />index = findIndex(num, i, num[i]);<br />tn = num[i];<br />void *pSrc = num + index;<br />void *pDes = num + index + 1;<br />int count = (i - index) * sizeof(int);<br />memmove(pDes, pSrc, count);<br />num[index] = tn;<br />}<br />}<br />int main()<br />{<br />int num[] = {2, -8, 9, 3, -99, 7, 2, 70};<br />InsertSort(num, 8);</p><p>for (int i = 0; i < 8; i++)<br />{<br />cout<<num[i]<<" ";<br />}<br />return 0;<br />}<br /> 

 

知識點:

1、memcpy不考慮重疊的情況;memmove考慮了重疊的情況。

2、int *pi; char *pc; void *pv; 假設指標的初始化的值都是0x0012ff40。

   則pi+1的值是0x0012ff44; pc+1的值是0x0012ff41; pv+1編譯錯誤,未知大小(類型)。針對32位系統。

3、對插入排序演算法的最佳化。

4、對該插入的位置尋找,二分尋找的變種。

再給出一個標準二分尋找演算法:

int BinarySearch(int array, int length, int item)<br />{<br />int left = 0;<br />int right = length - 1;<br />int middle;<br />while (left <= right)<br />{<br />middle = (left + right) / 2;<br />if (array[middle] > item)<br />{<br />right = middle - 1;<br />}<br />else if (array[middle] < item)<br />{<br />left = middle + 1;<br />}<br />else<br />{<br />return middle;<br />}<br />}<br />return -1;<br />}<br /> 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.