1. 程式人生 > >C程式設計——快速排序

C程式設計——快速排序

1、程式檔案

#include <stdio.h>

// 快速排序(Quicksort)是對氣泡排序的一種改進
// 通過一趟排序將要排序的資料分割成獨立的兩部分,
// 其中一部分的所有資料都比另外一部分的所有資料都要小,
// 然後再按此方法對這兩部分資料分別進行快速排序,
// 整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。
void mySwap(int *a, int i, int j)
{
	int tmp = a[i];
	a[i] = a[j];
	a[j] = tmp;
}
void myPrint(int *a, int len)
{
	int i;
	for (i = 0; i < len; i++)
	{
		printf ("%4d", a[i]);
	}
	printf ("\n");
}

// 算基準值下標
int partion(int *a, int left, int right)
{
	int pivot = a[right];    // 以最後一個元素作為基準值
	
	while(left < right)
	{
		// 本次迴圈結束後,a[left]的值比基準值大
		while (a[left] <= pivot && left < right)
		{
			left++;
		}
		if (left < right)
		{
			// 把以left為下標的比基準值更大的元素移到右邊

			a[right] = a[left];
			right--;
		}
		
		// 因為之前已經對a[left]進行了判斷,所以left < right
		while (a[right] >= pivot && left < right)
		{
			right--;
		}
		
		if (left < right)
		{
			// 把以right為下標的比基準值更小的元素移到左邊
			a[left] = a[right];
			left++;
		}
	}
	
	// 因為之前的right處的值已被a[left]覆蓋
	// 而right處的值被儲存在pivot中
	a[left] = pivot;
	
	// left是基準值下標
	return left;
}

void quickSort(int *a, int left, int right)
{
	if (left < right)
	{
		// 第一次得基準值下標0
		int pivotIndex = partion(a, left, right);    // 算基準值下標
		quickSort(a, left, pivotIndex-1);    // 對左半部分做快速排序
		quickSort(a, pivotIndex+1, right);   // 對右半部分做快速排序
	}
}

int main()
{
	int a[] = {5,8,6,0,9,4,3,2,1,7};
	int len = sizeof(a)/sizeof(a[0]);
	
	quickSort(a, 0, len-1);
	myPrint(a, len);
	
	return 0;
}

2、測試結果

[email protected]:/mnt/hgfs/shared-lj# gcc 快速排序study.c 
[email protected]:/mnt/hgfs/shared-lj# ./a.out 
0   1   2   3   4   5   6   7   8   9