快排,归并和Shell排序
生活随笔
收集整理的這篇文章主要介紹了
快排,归并和Shell排序
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
快速排序
快速排序的執(zhí)行流程:
(1) 先從數(shù)列中取出一個(gè)數(shù)作為基準(zhǔn)數(shù)。
(2) 將比這個(gè)數(shù)大的數(shù)全放到它的右邊,小于或等于它的數(shù)全放到它的左邊。
(3)再對(duì)左右區(qū)間重復(fù)第二步,直到各區(qū)間只有一個(gè)數(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]; //選擇基準(zhǔn)值i = left;j = right;while (i != j) {while (arr[j] >= temp && i<j) { //在右序列定位一個(gè)小于基準(zhǔn)值的元素j--;}while (arr[i] <= temp && i<j) { //在左序列定位一個(gè)大于基準(zhǔn)值的元素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排序是對(duì)插入排序的改進(jìn)。
Shell排序先選取一定的間隔,相差一個(gè)間隔的元素視為一個(gè)組,在每組內(nèi)進(jìn)行插入排序。
然后選取更小的間隔(一般折半)進(jìn)行插入排序,直至間隔為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個(gè)長(zhǎng)度為1的有序序列,將相鄰的有序表成對(duì)歸并,得到n/2個(gè)長(zhǎng)度為2的有序表;
將這些有序序列再次歸并,得到n/4個(gè)長(zhǎng)度為4的有序序列;如此反復(fù)進(jìn)行下去,最后得到一個(gè)長(zhǎng)度為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ù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的快排,归并和Shell排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 值类型与引用类型(下)
- 下一篇: 介绍map.entry接口