简单插入排序,折半插入排序和2路插入排序 c源码
生活随笔
收集整理的這篇文章主要介紹了
简单插入排序,折半插入排序和2路插入排序 c源码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
以下三種插入排序時間復雜度均為O(n^2)
簡單插入排序,簡單直接。假定數組有序,插入 i, 從后往前遍歷找到適合位置 j,移動 j +1 ~ i -1往后一位,插入i到j中。
void insertSort(int *arr, int numsSize) {int i, j, k, v;for (i = 1; i < numsSize; i++){for (j = i - 1; j >= 0; j--){if (arr[i] >= arr[j])break;}v = arr[i];for (k = i; k > j + 1; k--)arr[k] = arr[k-1];arr[k] = v; }return; }折半插入排序,和簡單插入排序相比減少比較次數,稍稍好那么一丟丟,時間復雜度還是O(n^2)
void BiInsertSort(int *arr, int numsSize) {int high, low, m, i, j, v;for (i = 1; i < numsSize; i++){high = i - 1;low = 0;v = arr[i];while (low <= high){m = (low + high)/2;if (arr[m] >= arr[i])high = m - 1;elselow = m + 1;}for (j = i; j > low; j--){arr[j] = arr[j-1];}arr[low] = v;} }2路插入排序,減少移動次數,額外增加一個循環數組,需要考慮邊界溢出,特別容易出錯。時間復雜度和其它插入排序相比沒有基本改變,不建議使用但是要理解并能夠寫出代碼。first和final分別表示循環數組中的起始位置。
void insertSort2(int *array, int arraysize) {int final, first, i, j, n;final = first = 0;if (!array || arraysize < 1)return ;int *tmp = (int *)malloc(sizeof(int) * arraysize);if (!tmp){printf("malloc error\n");return ;}tmp[0] = array[0];for (i = 1; i < arraysize; i++){if (array[i] >= tmp[0]){//插入到左邊j = final;while(array[i] < tmp[j])j--;for (n = ++final; n > j + 1; n--)tmp[n] = tmp[n-1];tmp[n] = array[i]; }else{//插入到右邊if (first == 0){first = arraysize - 1;tmp[first%arraysize] = array[i];} else{j = first - arraysize;while(tmp[(j + arraysize)%arraysize] < array[i])j++;for (n = (--first - arraysize); n < (j - 1); n++)tmp[(n + arraysize)%arraysize] = tmp[(n + 1 + arraysize)%arraysize];tmp[(n + arraysize)% arraysize] = array[i]; }}} }=============================================================================================
Linux應用程序、內核、驅動、后臺開發交流討論群(745510310),感興趣的同學可以加群討論、交流、資料查找等,前進的道路上,你不是一個人奧^_^。
?
總結
以上是生活随笔為你收集整理的简单插入排序,折半插入排序和2路插入排序 c源码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 支付宝3小时公益取消会影响信用吗
- 下一篇: 希尔排序(ShellSort) c源码