快速排序算法實現:單向掃描法&&雙向掃描法&&三分法(有相同元素)

單向指針掃描


void Swap(int i, int j, int array[])//交換數組內兩個元素
 {
	 int temp;
	 temp = array[i];
	 array[i] = array[j];
	 array[j] = temp;
 }
void QuickSort(int begin, int end, int array[])//快速排序
{
	 if (begin<end)
	 {
		 int mid = Partition(begin, end, array);//mid返回中間項
		 QuickSort(begin, mid-1, array);//遞歸調用,對mid左邊的進行快排
		 QuickSort(mid + 1,end, array);//遞歸調用,對mid右邊的進行快排
	 }

}


int Partition(int begin, int end, int array[])//單向掃描快排中分割函數,結果返回中間項
{
	int pivot = array[begin];//初始中間項值=首元素
	int sp = begin + 1;//掃描指針下標
	int bigger = end;//bigger指針初始在尾部
	while (sp<=bigger)//當掃描指針位於bigger左邊或者重合,
	{
		if (array[sp] > pivot)//如果掃描到的值大於中間項值
		{
			Swap(sp,bigger,array);//交換兩者
			bigger--;//左移1位
		}
		else//<=中間項
		{
			sp++;//繼續向後掃描
		}
	}//此時sp指向最後一個比中間項(首元素)大的值,bigger指向最後一個<=中間項的元素
	Swap(begin, bigger, array);//交換,此時新的bigger位置爲中間項(值是初始的中間項值)。左邊都是小的,右邊都是大的
	return bigger;//返回中間項下標bigger(即pivot)
}



雙向指針掃描

int DoubblePartition(int begin,int end,int array[])//雙向掃描法左右指針left,right
{
	int pivot = array[begin];
	int left = begin + 1;//左側指針指向pivot後1個元素
	int right = end;//右側指針指向尾元素
	while (left<=right)
	{
		if (array[left]<=pivot && left <= right)//左指針掃描元素都小於pivot
		{//最終arrayleft肯定是大於pivot
			left++;//繼續往右
		}
		if (array[right] > pivot&&left <= right)//右指針都大於pivot
		{//最終array[right]肯定是小於pivot
			right--;//繼續向左
		}
		//注意!:上面2個加上left <= right條件防止,排序完成後left和right再次移動,因爲最後一次left會一直往後跑,外層循環不一定控制的住內層循環
		//雖然我測試很多次並沒有遇到這個情況。。
		else if(left<right)//以上兩者都不滿足,左右指針停止,條件left!=right等於時候交換,沒有意義的
		{
			Swap(left, right,array);//先交換二者值,再繼續掃描
			
		}
	}
	Swap(begin, right, array);
	return right;
}

void DoubbleQuickSort(int begin, int end, int array[])//雙向掃描快排
{
	if (begin < end)
	{
		int mid = DoubblePartition(begin, end, array);//mid返回中間項
		DoubbleQuickSort(begin, mid - 1, array);//遞歸調用,對mid左邊的進行快排
		DoubbleQuickSort(mid + 1, end, array);//遞歸調用,對mid右邊的進行快排
	}

主函數(生成隨機數組測試數據)

int main() {
	srand((unsigned int)time(NULL));//隨機數生成器初始化
	int s[9];//聲明一個9個元素大小的數組
	cout << "初始數組爲:";
	for (int i = 0; i < 9; i++)
	{
		s[i] = rand() % 100;//生成0~100的隨機數
		cout << s[i] << ",";
	}
	cout << endl;
	
	//BubbleSort(9, s);
	//SelectSort(9, s);
	//InsertSort(9, s);
	//ShellSort(9, s);
	DoubbleQuickSort(0, 8, s);
	cout << "快速排序後數組爲";
	for (int i = 0; i < 9; i++)
	{
		cout << s[i] << ",";
	}
	system("pause");
	return 0;
}

測試結果

在這裏插入圖片描述

有相同元素的三分法(待更新)

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