快速排序(C.A.R.Hoare版)

這個快速排序是快速排序的最初版本,是由C.A.R.Hoare設計的。

基本思路:

    1.將待排序數據存入一維數組中,然後以第一個值爲基準值。起初i指向第一個元素,j指向最後一個元素之後的位置。  

    2.分別從兩端遍歷數組,直到i所指向的值比基準值大,以及j所指向的值比基準值小時,分別停止遍歷,然後交換i,j所指向的值。

    3.重複步驟2,直到i >= j,然後交換p和j所指向的值,此時序列別分隔成兩部分,基準值右邊的值都比基準值大,而左邊的元素都比基準值小。 

    4.分別對左右兩部分重複1-4步驟,即可完成排序。(如下圖)  

            

            

/*
 *  名稱:快速排序
 *  作者:Brooke gao
 *  時間:2013/6/17
 *  注:此算法來自《計算機算法設計與分析》王曉東 編
 *
*/

#include <stdio.h>

#define SIZE 100

void swap(int *x, int *y)
{
	int temp = *x;
	*x = *y;
	*y = temp;
}

int Partition(int *A, int p, int r)
{
	int i, j, x;
	
	i = p;
	j = r + 1;

	x = A[p];

	while(1)
	{
		while(A[++i] < x);
		while(A[--j] > x);

		if(i >= j)
			break;
		swap(&A[i],&A[j]);
	}
	A[p] = A[j];
	A[j] = x;
	
	return j;
}

void QuickSort(int *A, int p, int r)
{
	int q;
	if(p < r)
	{
		q = Partition(A,p,r);
		QuickSort(A,p,q-1);
		QuickSort(A,q+1,r);
	}
}

void PrintResult(int *A, int size)
{
	int i;
	for(i = 0; i < size; i++)
	{
		printf("%-2d",A[i]);
	}
	putchar('\n');

}
int main(void)
{
	int A[SIZE], i, sum;
	printf("輸入要排序元素的個數(0-100): ");
	scanf("%d",&sum);

	printf("請輸入%d個整數:\n",sum);
	for(i = 0; i < sum; i++)
	{
		scanf("%d",&A[i]);
	}

	QuickSort(A,0,sum-1);
	
	printf("排序結果:\n");
	PrintResult(A,sum);
}


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