快速排序

#include <iostream>
using namespace std;
#define N 10
int a[N] = {3,6,9,1,2,5,7,4,0,8};
void quick(int left, int right)
{
	int sign = a[left];
	int i = left;
	int j = right;
	if(left > right)
		return ;
	while (i != j)
	{
		while (i < j && sign <= a[j])//從右往開始找到此時數組中比第一個數小的位置的座標j
			j--;
		while (i < j && sign >= a[i])//從左往開始找到此時數組中比第一個數大的位置的座標i
			i++;

		if (i < j)//將i和j對應數組的數值交換
		{
			int tmp = a[i];
			a[i] = a[j];
			a[j] = tmp;
		}
	}
	//以上while循環結束後,得到他們的交遇點i
	int tmp1 = a[i];//將此時數組的第一個數和交遇點i對應數組的數值交換
	a[i] = a[left]; 
    a[left] = tmp1; 

    quick(left,i-1); //將此時數交遇點i-1之前數組進行排序
    quick(i+1,right);//將此時數交遇點i+1之後數組進行排序
		
}
int main()
{
	for (int i =0; i < N; i++)
		cout<<a[i]<< "  ";	
	cout<<endl;

	quick(0, N-1);

	for (i =0; i < N; i++)
		cout<<a[i]<< "  ";	
	cout<<endl;

	return 0;
}


快速排序的解題思路

先從數組右邊開始往左找到比第一個數小的做標記

然後從數組左邊開始往右找到比第一個數大的做標記

之後交換這倆個數

繼續從標誌往左搜索,再從標誌往右搜索,

如果標誌和標誌未相遇,繼續重複以上步驟

 

直到標誌和標誌到達同樣位置

首地址和標誌交換

 

以標誌爲中心,分開成兩個部分,分別處理,也就說兩個數組分別重複以上步驟





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章