快排,归并和Shell排序
生活随笔
收集整理的這篇文章主要介紹了
快排,归并和Shell排序
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
快速排序
快速排序的執(zhí)行流程:
(1) 先從數(shù)列中取出一個數(shù)作為基準數(shù)。
(2) 將比這個數(shù)大的數(shù)全放到它的右邊,小于或等于它的數(shù)全放到它的左邊。
(3)再對左右區(qū)間重復第二步,直到各區(qū)間只有一個數(shù)。
C程序?qū)崿F(xiàn):
int *q_sort(int *arr, int left, int right) {int i, j, t, temp;if (left >= right) {return arr; }temp = arr[left]; //選擇基準值i = left;j = right;while (i != j) {while (arr[j] >= temp && i<j) { //在右序列定位一個小于基準值的元素j--;}while (arr[i] <= temp && i<j) { //在左序列定位一個大于基準值的元素i++;}if (i < j) { //交換t = arr[i];arr[i] = arr[j];arr[j] = t; } }arr[left] = arr[i];arr[i] = temp;q_sort(arr,left, i-1); //左側(cè)序列遞歸q_sort(arr,i+1, right); //右側(cè)遞歸return arr; }Shell排序
Shell排序是對插入排序的改進。
Shell排序先選取一定的間隔,相差一個間隔的元素視為一個組,在每組內(nèi)進行插入排序。
然后選取更小的間隔(一般折半)進行插入排序,直至間隔為1。
C程序?qū)崿F(xiàn):
int *shell_sort(int *arr, int Len) {int i, j, t, gap;for (gap = Len / 2; gap > 0; gap /= 2) {for (i = gap; i < Len; i++) {for ( j = i - gap; j >= 0 && arr[j] > arr[j + gap]; j -= gap) {t = arr[j];arr[j] = arr[j+gap];arr[j+gap] = t;}}}return arr; }歸并排序
將待排序序列R[0...n-1]看成是n個長度為1的有序序列,將相鄰的有序表成對歸并,得到n/2個長度為2的有序表;
將這些有序序列再次歸并,得到n/4個長度為4的有序序列;如此反復進行下去,最后得到一個長度為n的有序序列。
C程序?qū)崿F(xiàn):
void merge_sorting(int *arr, int first, int last, int *temp) {int mid = (first + last) / 2; if (first < last) {merge_sorting(arr, first, mid, temp);merge_sorting(arr, mid + 1, last, temp);merge_array(arr,first, mid, last, temp);} }void merge_array(int *arr, int first, int mid, int last, int *temp) {int i = first, j = mid + 1, k = 0;int m = mid, n = last;while (i <= m && j <= n) {if (arr[i] <= arr[j]) {temp[k++] = arr[i++]; }else {temp[k++] = arr[j++]; } }while (i <= m) {temp[k++] = arr[i++]; }while (j <= n) {temp[k++] = arr[j++]; }for (i = 0; i < k; i++) {arr[first + i] = temp[i]; } } 《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的快排,归并和Shell排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 值类型与引用类型(下)
- 下一篇: php strtotime 和 date