快速排序和歸併排序(C語言)
- 快速排序
- 歸併排序
閱讀之前注意:
本文閱讀建議用時:20min
本文閱讀結構如下表:
項目 | 下屬項目 | 測試用例數量 |
---|---|---|
快速排序 | 無 | 1 |
歸併排序 | 無 | 1 |
快速排序
快速排序(我們以升序爲例)的關鍵在於:
- 把第一個值看做是樞紐值(pivot),利用兩個座標把這個樞紐值傳到序列的合適位置,使得左邊的值均比樞紐值小,右邊的值均比樞紐值大
- 對樞紐值左邊的序列(不包括樞紐值)做第一步的處理,對樞紐值右邊的序列也做第一步的處理。直至被處理的序列只有一個數。
參考以下代碼:1
#include<stdio.h>
#include<stdlib.h>
void swap(int *a,int low,int high)//交換
{
int tmp = a[low];
a[low] = a[high];
a[high] = tmp;
}
int partition(int *a,int low,int high)//尋找樞紐值
{
while (low < high)
{
while ((low < high) && (a[low] <= a[high]))
high--;
swap(a, low, high);
while ((low < high) && (a[low] <= a[high]))
low++;
swap(a, low, high);
}
return low;//當low=high時,座標即樞紐
}
void quickSort(int *a,int low,int high)//快速排序
{
if (low >= high)
return;//退出條件
int pivot = partition(a, low, high);//第一步,尋找樞紐值
quickSort(a, low, pivot - 1);//對樞紐值左邊的序列快速排序
quickSort(a, pivot + 1, high);//對樞紐值右邊的序列快速排序
}
void main()
{
int a[10] = { 1, 9, 5, 4, 2, 7, 8, 6, 3, 0 };
quickSort(a, 0, 9);
for (int i = 0; i < 10; i++)
printf("%d ", a[i]);
system("pause");
}
歸併排序
歸併排序(我們以升序爲例)的關鍵在於:
- 對整個序列等分,之後對左序列等分,對右序列等分,直至最後被等分的序列成爲單個數。再從單個數開始不斷歸併(merge),歸併後的序列是有序的,這樣子的左序列和右序列再歸併還是有序的。
參考以下代碼:
#include<stdio.h>
#include<stdlib.h>
void merge(int *des,int *src,int size,int low,int mid,int high)//歸併
{
int i = low;
int j = 0;
int k = 0;
j = mid + 1;
while ((low <= mid) && (j <= high))
{
if (src[low] < src[j])
des[i++] = src[low++];
else
des[i++] = src[j++];
}
while (low <= mid)
des[i++] = src[low++];
while (j <= high)
des[i++] = src[j++];
}
void sort(int *des, int *src, int size,int low,int high)//歸併排序
{
if (low == high)
{
des[low] = src[low];//重要
return;
}
int *space = (int *)malloc(size*sizeof(int));//開闢臨時空間
int mid = (low + high) / 2;//等分
sort(space, src, size, low, mid);//對左序列歸併排序
sort(space, src, size, mid + 1, high);//對有序列歸併排序
merge(des, space, size, low, mid, high);//把左序列和右序列歸併
free(space);
}
void main()
{
int a[10] = { 1, 9, 4, 7, 3, 2, 5, 6, 0, 8 };
int b[10] = { 0 };
sort(b, a, 10, 0, 9);
for (int i = 0; i < 10; i++)
printf("%d ", b[i]);
system("pause");
}
快速排序和歸併排序其實都是分而治之,其中歸併排序不僅需要化整爲零,還需要化零爲整。2
如果本文對你有幫助,不如請我一罐可樂吧 🍼