排序算法(五)————快速排序

快速排序是一种效率很高的排序算法,也是我们使用最多的一种排序算法。
快速排序原理:
两个指针分别指向数组两头元素,将数组第一个元素保存下来,作为基准数,两个指针开始向中间移动,先移动数组尾部指针,直到发现所指元素比基准数小时,将这时候所指向的数赋值给数组头部指针指向的位置,然后尾部指针停止移动,头部指针开始移动,直到移动到所指向的元素比基准元素大时,将此时所指向的元素赋值给尾部指针所指向的位置,头部指针停止移动,尾部指针再次开始移动,如此往复,当两个指针位置重合时,停止移动,将基准元素的值赋值给此时所指向的位置,第一次移动结束。此时将数组分为以基准元素左和右两个数组,分别递归进行上面的操作,直到得出最后的有序数列。

例:
有一组数列 3,12,2,14,66 请使用快速排序将他们进行从小到大排序。

解:
3 12 2 14 66
第一趟中我们先把val基准数设置为3
L指向3,H指向66,先移动H,我们发现移动到2时,2比3小,所以把2赋值给L指向的位置,此时数组变成:
2 12 2 14 66
此时H指向第二个2,L指向第一个2,移动L,到12发现其比基准数3要大,故将12赋值给H的位置,此时数组变为:
2 12 12 14 66
此时L指向第一个12,H指向第二个12,移动H,发现跟L重合了,所以此时将基准数赋值给此时的位置,数组变为:
2 3 12 14 66
第一趟结束,我们可以看出此时基准数3左边都比3要小,右边都比3要大,排序成功,将3左右拆成两个新数组:2 和 12 14 66,然后分别重复以上步骤,最后便可得到最终结果。

代码实现(以下代码已经过测试,可以直接运行):

#include <stdio.h>

void QuickSort(int* Arr, int low, int high);
int FindPos(int* Arr, int low, int high);

int main()
{
	int Arr[7] = { 13,45,23,45,78,66,99 };
	QuickSort(Arr, 0,6);
	for (int i = 0;i < 7;i++)
	{
		printf_s("%d", Arr[i]);
	}
}

//low为数组开始元素下标,high为结束元素下标
void QuickSort(int* Arr,int low,int high)
{
	int pos;
	if (low < high)
	{
		pos = FindPos(Arr, low, high);
		QuickSort(Arr, low, pos - 1);
		QuickSort(Arr, pos + 1, high);
	}
}

//用于找到基准点的排序后所在的位置
int FindPos(int* Arr,int low, int high)
{
	int val = Arr[low];
	while (low<high)
	{
		while (low < high && Arr[high]>=val)
		{
			high--;
		}
		Arr[low] = Arr[high];
		while (low<high && Arr[low]<=val)
		{
			low++;
		}
		Arr[high] = Arr[low];
	}
	Arr[low] = val;
	return low;
}

时间复杂度:O(nlogn) 推导过程涉及到递归的时间复杂度求解,以后将更新给出。

原创文章 24 获赞 2 访问量 924

猜你喜欢

转载自blog.csdn.net/weixin_43653187/article/details/104732379
今日推荐