快速排序

快速排序設計思想:

  • 找一個記錄(例如取第一個記錄),以它的關鍵字作爲“樞軸”。
  • 凡其關鍵字小於樞軸的記錄均移動至該紀錄“之前”。
  • 凡其關鍵字大於樞軸的記錄均移動至該紀錄“之後”。 即對無序的記錄序列進行一次劃分。
  • 之後分別對分割所得兩個子序列“遞歸”進行快速排序,

快速排序的具體分析:

  • 設兩個下標 i 和 j 。i 標記整個序列的起始位置,j 標記整個序列最後一個元素所在的位置。接着使用一個臨時變量,先保存樞軸的值21。
    在這裏插入圖片描述
  • 保存完畢以後,先從右邊找到一個比樞軸的值小的值。如果找到以後,兩者之間進行交換。如果未找到,進行 j - 1操作。首先將37與21進行比較,不小,將 j 向前移動,將52與21進行比較,不小,繼續將 j 向前移,將8與21比較。此時8小於21,將8和21進行交換。即將8存放在下標爲0的位置上。此時j的下標爲5.

在這裏插入圖片描述

  • 接着從左邊開始找到一個比樞軸值大的值,首先進行 i +1 操作。若找到,將兩者進行交換,否則進行 i + 1操作。此時25>21,即25應該到 j 所標記的位置。

在這裏插入圖片描述
經過交換後,應該是:

在這裏插入圖片描述

  • 下一步繼續從右邊找到一個比樞軸小的值進行交換;

在這裏插入圖片描述

  • 再從左邊找到一個比樞軸值大的值進行交換:

在這裏插入圖片描述

  • 整個步驟全是右面找一次,左邊找一次。直到 i 和 j 相等時 完成一趟快速排序。

在這裏插入圖片描述

在這裏插入圖片描述

  • 最後將21的這個值存放在 i 等於 j 的位置上。

在這裏插入圖片描述

  • 以上爲第一趟快速排序

在這裏插入圖片描述

  • 之後分別對兩個子序列進行快速排序

快速排序代碼如下:

#include<stdio.h>
int a[9]={7,1,2,4,2,5,8,7,9};
int Partition(int low, int high)
{
	
	int pivotkey = a[low];        //樞軸記錄關鍵字
	while(low < high)             //從兩端交替地向中間掃描 
	{
		while(low < high && a[high] >= pivotkey)
			high--;               //將比樞軸記錄小的記錄移到低端 
		a[low]=a[high];
		while(low < high && a[low] <= pivotkey)
			low++;               // 將比樞軸記錄大的記錄移到高端
		a[high]=a[low];
	}
	a[high] = pivotkey;               //樞軸記錄到位
	return low; 
} 
void Qsort(int low,int high)
{
	if(low < high)      //長度 > 1 
	{
		int pivoloc = Partition(low,high);   //將其一分爲二 
		Qsort(low,pivoloc-1);                //對左半部分進行遞歸排序,pivoloc是樞軸位置 
		Qsort(pivoloc+1,high);               //對右半部分進行遞歸排序 
	}
}
int main()
{
	int i; 
	Qsort(0,8);
	for(i=0;i<9;i++)
    	printf("%d ",a[i]);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章