參考文章: 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 />