快速排序

快速排序的分治法的一個典型應用,其時間複雜度是O(logN)。
比如將6,12,1,4,7,15,3這7給元素進行排序。首先選出一個基準值,一般是選用第一個元素,這裏也就是6。然後開始從最右邊開始尋找比基準值小的元素放到基準值的左邊,然後從左開始尋找比基準值大的元素放大基準值的右邊。
其執行過程:
第一趟:基準值6 用一個變量來保存。
在這裏插入圖片描述
設置兩個哨兵,i=0,j=6。從右開始找比基準值小的元素,也就是不斷的j–來判斷下標爲j的元素是否比基準值小,注意到3比6小,將3放到下標爲i的位置(此時j的值爲6),然後i++。從左開始找比基準值大的元素,也就是不斷的i++來判斷下標爲i 的怨誰呢是否比基準值大,注意到12比6大,將12放到j所指向的位置(此時i的值爲1),然後j–。

就變成了i=1,j=5。
在這裏插入圖片描述
接着從有開始尋找比6小的元素,注意到4比6小,將4放到下標爲i的元素(此時i已經變成1了,j變成3了)。然後找比6大的元素,注意此時j爲3,i爲1,一直把i++來尋找比6大的數,一直尋找到i爲3的時候,此時i已經不小於j了,都沒有找到比基準值6小的數,所以此輪結束。然後將基準值填入i的位置也就是下標爲3的位置。
在這裏插入圖片描述
下輪以這次的基準值6爲界,將整個序列分爲兩個部分,分別對左半部分和右半部分分別進行快速排序。

第二輪:
對左半部分排序:
取基準值3,i=0,j=2。
從右開始尋找比3小的數注意到是1,將1放到下標爲i(0)的位置,然後i++,變爲1。然後從左開始尋找比3的數注意到是4,將4放到下標爲j的位置(2),然後j–,j變成了1,此時i已經不小於j,這一趟排序也結束了,將基準值3放到下標爲i(1)的位置。
在這裏插入圖片描述
對右半部分排序:
基準值爲7,i=4,j=6。
從右開始尋找比7小的數,j一直自減到4也沒有發現比7小的數,此時i已經不小於j了,此時這一趟排序結束,注意到這一趟排序只做了比較並沒有交換任何一組數據。
對左右兩部分都做了排序,此時這一輪已經排序結束了。
在這裏插入圖片描述
第三輪:
注意到上一輪對左半部分的排序,以3爲基準時,3的左邊只有1,右邊只有4,都只有一個元素,說明這一部分已經全部排序完畢了。
上一輪對右半部分的排序,以7爲基準時,7的左邊沒有元素,只用對7右邊的元素進行排序。
此時以15爲基準,i=5,j=6。
從右開始尋找比15小的元素,此時爲12,將12放到i的位置,然後i++。此時i變成6了,i不再小於j,將基準值放到i的位置。這一輪結束。
在這裏插入圖片描述
這個時候已經全部有序了。
實現代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10
void sort(int a[], int left, int right);
int main()
{
	int a[N];
	srand((unsigned) time(NULL));
	//隨機生成數組的值
	for (int i = 0; i < N ; i++)
		a[i] = rand();
	printf("排序前\n");
	for (int i = 0; i < N; i++)
	{
		printf("%d\n", a[i]);
	}
	sort(a, 0, N - 1);
	printf("排序後\n");
	for (int i = 0; i < N; i++)
	{
		printf("%d\n", a[i]);
	}
	return 0;
}
void sort(int a[], int left, int right)
{
	if (left < right)
	{
		int i = left, j = right;
		//每次將待排序序列的最左邊一個元素作爲基準數
		int temp = a[left];
		while (i < j)
		{
			//從右開始尋找比基準數小的元素
			while (a[j] >= temp && j > i)
			{
				j--;
			}
			if (j > i)
			{
				a[i] = a[j];
				i++;
			}
			//從左開始尋找比基準數大的元素
			while (a[i] <= temp && j > i)
			{
				i++;
			}
			if (j > i)
			{
				a[j] = a[i];
				j--;
			}	
		}
		//將基準數放到他的位置
		a[i] = temp;
		//進行左半部分的排序
		sort(a, left, i - 1);
		//進行右半部分的排序
		sort(a, i + 1, right);
	}
}

實現效果:
在這裏插入圖片描述

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