排序算法之快速排序 分類: C/C++ 數據結構與算法 2015-06-30 07:59 95人閱讀 評論(0) 收藏

       快速排序將以樞軸爲界,將原數組分爲兩個部分,樞軸之前,值都小於樞軸的值,樞軸之後的值都大於樞軸。
       採用遞歸的方法,對以樞軸爲界的兩個子序列進行快速排序,直至子序列長度爲1。
       一、快速排序的關鍵是樞軸的選取,主要有三種方法:1)選取第一個或最後一個做爲樞軸值; 2)採用隨機數生成器,生成樞軸值的下標;3)取第一個、最後一個、中間三者的中間值做爲樞軸值,當數據量比較大的時候,甚至採起九數取中的方式。
       二、快速排序由於要遞歸,當須要排序的數組量比較小時,使用普通的排序算法效果可能更好,因此排序前可先進行判斷,若是子序列長度大於閥值則採用快速排序,不然採用插入排序或選擇排序等。

      相較於歸併排序和堆排序,快速排序是一種高效並且簡單的排序方法。算法

int partion(SqList* list, int low, int high)
{//返回樞軸下標
	int key = list->data[high];//樞軸值
	int fast = low;
	int slow = low;
	while (fast < high)
	{
		if (list->data[fast] < key)
		{
			if (slow != fast)
			{
				swap(list->data[fast], list->data[slow]);				
			}
			fast++;
			slow++;
		}
		else
		{
			fast++;
		}
	}
	swap(list->data[slow], list->data[high]);
	return slow;
}
void qsort1(SqList* list,int low,int high)
{
	if (low < high)
	{
		int index = partion(list,low,high);
		qsort1(list, low, index - 1);//高低子表都採用遞歸的方法實現
		qsort1(list, index + 1, high);
	}
}

#define MAX_LENGTH_INSERT_SORT 7//定義插入排序能夠接受的最大數組
void qsort2(SqList* list, int low, int high)
{
	if ((high - low) > MAX_LENGTH_INSERT_SORT)
	{
		if (low < high)
		{
			int index = partion(list, low, high);
			qsort2(list, low, index - 1);
			qsort2(list, index + 1, high);
		}
	}
	else
		InsertSort2(list);
}
//只用一次遞歸,高子表採用迭代的方式,減少了遞歸的深度。
void qsort3(SqList* list, int low, int high)
{
	if ((high - low) > MAX_LENGTH_INSERT_SORT)
	{
		if (low < high)
		{
			int index = partion(list, low, high);
			qsort3(list, low, index - 1);
			low = index + 1;//高子表不遞歸,採用迭代
		}
	}
	else
		InsertSort2(list);//固然,此處不能直接使用,還須要對InsertSort2做一下修改,改爲指定下標的形式
}
void QuickSort(SqList* list)
{
	qsort1(list,0,list->length-1);
}
相關文章
相關標籤/搜索