快速排序笔记以及代码实现

快速排序是一种采用分治策略的排序算法,通过选取基准元素pivot,将数组分为小于pivot和大于pivot两部分,然后对这两部分递归地进行排序,直到整个数组有序。具体实现中,通过维护左右指针i和j,找到合适的位置交换元素,确保pivot两侧元素正确分布。
摘要由CSDN通过智能技术生成

 1.大致思想

        快速排序是一种特别适合乱序数组排序的算法,其利用了分治思想以及递归的方式,通过在数组之中选取”哨兵“int pivot,以”哨兵“为基准用左右往中间循环遍历的方式根据大小把其他元素排列在哨兵左右,使得pivot左边都小于pivot',右边都大于pivot,当然,此时的pivot左右两边都不一定只有一个元素了,所以还需要用到递归,让当时的pivot左右两边各自再次进入快排函数执行选择pivot,排序的过程,直到传入快排函数的左右i,j是相同位置时停止循环。

2.具体实现

        首先传入快排函数的参量有待排序的数组,数组待处理段的最左边元素的下标以及数组待处理段最右边的元素的下标,在函数中先用循环变量i,j,分别储存左边的下标和末尾下标,还需要选择出一个基准变量pivot,我这个函数中默认使用了数组待处理段最左边的元素下标(也可以随机选取),此时递归函数需要一个出口,出口就是当传进来的待处理段左端下标不小于右端下标时,退出当前递归(说明前一个pivot排序完成后某一边只有一个元素),如果i<j,就执行下面的循环,让arr[ j ]从右端开始往前遍历检索,如果arr[ j ]确实大于pivot,说明它可以放在右端,让 j - -,直到遇到不满足遍历条件的即arr[ j ]<pivot时,不再循环,而是把这个比pivot小的数直接覆盖到最左端那个元素上(此时最左端那个元素arr[ i ] 已经被pivot储存起来了,故不会出现数据丢失),此时的 j 值保留在那个地方,覆盖后再让i从左端开始遍历,此时arr[ i ]已经时刚刚那个覆盖过来的小于pivot的数了,所以第一步肯定会执行i++,往后检索直到 i,j 相遇或者检索到的arr[ i ]大于了pivot,再把此时这个大于pivot的arr[ i ]直接覆盖到之前那个arr[ j ]处(arr[ j ]是上一轮比pivot小的数,已经覆盖到了左端,所以不会出现数据丢失),这俩步做完后 i,j 如果还没相遇,说明中间还有元素没有根据pivot这个基准去排序,所以再进行一次以上的遍历检索,直到 i ,j 相遇跳出外部while循环,把之前保存的那个pivot值放在 i,j 交汇处,这样以这个pivot为轴的一轮排序就完成了,满足了pivot左边都小于pivot,右边都大于pivot。但是此时pivot左右的元素不一定都是全部有序,再把pivot左边的部分数组和右边部分的数组重新带入函数里面,进行递归操作即可。

3.具体代码

void quick_sort(int arr[], int left, int right) {
	int i = left;
	int j = right;
	int pivot=arr[i];
	if (i >= j) {
		return;
	}
	while (i < j) {
		while (i < j && arr[j] >= pivot) {
			j--;
		}
		arr[i] = arr[j];
		while (i < j && arr[i] <= pivot) {
			i++;
		}
		arr[j] = arr[i];
	}
	arr[i] = pivot;
	quick_sort(arr, left, i - 1);
	quick_sort(arr, i + 1, right);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值