快速排序和歸併排序(C語言)

快速排序和歸併排序(C語言)

996.icu LICENSE

  • 快速排序
  • 歸併排序

閱讀之前注意:

本文閱讀建議用時:20min
本文閱讀結構如下表:

項目 下屬項目 測試用例數量
快速排序 1
歸併排序 1

快速排序

快速排序(我們以升序爲例)的關鍵在於:

  1. 把第一個值看做是樞紐值(pivot),利用兩個座標把這個樞紐值傳到序列的合適位置,使得左邊的值均比樞紐值小,右邊的值均比樞紐值大
  2. 對樞紐值左邊的序列(不包括樞紐值)做第一步的處理,對樞紐值右邊的序列也做第一步的處理。直至被處理的序列只有一個數。
    參考以下代碼: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");
}

歸併排序

歸併排序(我們以升序爲例)的關鍵在於:

  1. 對整個序列等分,之後對左序列等分,對右序列等分,直至最後被等分的序列成爲單個數。再從單個數開始不斷歸併(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

如果本文對你有幫助,不如請我一罐可樂吧 🍼
在這裏插入圖片描述


  1. 程序基於王保明先生的講課內容. ↩︎

  2. 程序基於王保明先生的講課內容. ↩︎

發佈了49 篇原創文章 · 獲贊 28 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章