快速排序算法【數據結構-郝斌】

 方式1、將快速排序分爲查找函數和排序函數;

#include <stdio.h>
/*查找函數*/
int Findpow(int *arr, int low, int high)
{
	int flag=arr[low]; //將需要查找位置的第一個數字賦值給flag;
	while (low < high)//邊界條件;
	{
		while ((low<high) && (arr[high] >= flag))//當高位大於等於flag標誌位時,應該將高位<<右移;
		{
			--high;//右移;
		}
		if (low < high)
		{
			arr[low] = arr[high];//當高位小於flag時,賦值給低位;
		}
		while ((low<high) && (arr[low] <= flag))//當低位小於等於flag標誌位時,應該將低位>>左移;
		{
			++low;//左移;
		}
		if (low < high)
		{
			arr[high] = arr[low];//當低位大於flag時,賦值給高位;
		}
	}
	arr[low] = flag;//當low和high重合時,位置找到,將需要查找的數放進位置。
	return low;//將這個位置返回給排序函數;
}

/*排序函數【遞歸實現】*/
void QiuckSort(int *arr, int low, int high)
{
	int pow=0;//設置位置標誌;
	if (low<high)
	{
		pow = Findpow(arr,low, high);//該位置將原來的線性數據分成兩半;
		QiuckSort(arr, low, pow-1);//再將左邊的數據查找切分;
		QiuckSort(arr, pow+1,high);//再將右邊的數據查找切分;
	}
}


/*測試主函數*/
int main()
{
	int a[] = { 4, 1, -2, 56, 22, 4, 7, 52, 4, 8, 6, 2 ,-5};
	int num = sizeof(a) / sizeof(int);
	QiuckSort(a, 0, num-1);
	for (int i = 0; i < num; i++)
	{
		printf("%d   ",a[i]);
	}
	getchar();
	return 0;

}

 方式2、將快速排序合併爲一個函數;

[合併時,主要是注意變量的改變問題]

#include <stdio.h>
/*快速排序函數【完整功能】*/
void QiuckSort(int *arr, int low, int high)
{
	
	if (low<high)
	{
		int pow;
		int flag;
		int nlow = low, nhigh = high;//在該函數內low和high屬於全局變量,所以應該讓局部變量改變,全局變量不變。
		flag = arr[low];
		while (nlow < nhigh)
		{
			while ((nlow<nhigh) && (arr[nhigh] >= flag))
			{
				--nhigh;
			}
			if (nlow<nhigh)
			{
				arr[nlow] = arr[nhigh];
			}
			
			while ((nlow<nhigh) && (arr[nlow] <= flag))
			{
				++nlow;
			}
			if (nlow < nhigh)
			{
				arr[nhigh] = arr[nlow];
			}
		}
		arr[nlow] = flag;
		pow = nlow;
		QiuckSort(arr, low, pow - 1);
		QiuckSort(arr, pow + 1, high);
	}
}

/*測試主函數*/
int main()
{
	int a[] = { 4, 1, -2, 56, 22, 4, 7, 52, 4, 8, 6, 2 ,-5};
	int num = sizeof(a) / sizeof(int);
	QiuckSort(a, 0, num-1);
	for (int i = 0; i < num; i++)
	{
		printf("%d   ",a[i]);
	}
	getchar();
	return 0;

}

 

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