快速排序

快速排序设计思想:

  • 找一个记录(例如取第一个记录),以它的关键字作为“枢轴”。
  • 凡其关键字小于枢轴的记录均移动至该纪录“之前”。
  • 凡其关键字大于枢轴的记录均移动至该纪录“之后”。 即对无序的记录序列进行一次划分。
  • 之后分别对分割所得两个子序列“递归”进行快速排序,

快速排序的具体分析:

  • 设两个下标 i 和 j 。i 标记整个序列的起始位置,j 标记整个序列最后一个元素所在的位置。接着使用一个临时变量,先保存枢轴的值21。
    在这里插入图片描述
  • 保存完毕以后,先从右边找到一个比枢轴的值小的值。如果找到以后,两者之间进行交换。如果未找到,进行 j - 1操作。首先将37与21进行比较,不小,将 j 向前移动,将52与21进行比较,不小,继续将 j 向前移,将8与21比较。此时8小于21,将8和21进行交换。即将8存放在下标为0的位置上。此时j的下标为5.

在这里插入图片描述

  • 接着从左边开始找到一个比枢轴值大的值,首先进行 i +1 操作。若找到,将两者进行交换,否则进行 i + 1操作。此时25>21,即25应该到 j 所标记的位置。

在这里插入图片描述
经过交换后,应该是:

在这里插入图片描述

  • 下一步继续从右边找到一个比枢轴小的值进行交换;

在这里插入图片描述

  • 再从左边找到一个比枢轴值大的值进行交换:

在这里插入图片描述

  • 整个步骤全是右面找一次,左边找一次。直到 i 和 j 相等时 完成一趟快速排序。

在这里插入图片描述

在这里插入图片描述

  • 最后将21的这个值存放在 i 等于 j 的位置上。

在这里插入图片描述

  • 以上为第一趟快速排序

在这里插入图片描述

  • 之后分别对两个子序列进行快速排序

快速排序代码如下:

#include<stdio.h>
int a[9]={7,1,2,4,2,5,8,7,9};
int Partition(int low, int high)
{
	
	int pivotkey = a[low];        //枢轴记录关键字
	while(low < high)             //从两端交替地向中间扫描 
	{
		while(low < high && a[high] >= pivotkey)
			high--;               //将比枢轴记录小的记录移到低端 
		a[low]=a[high];
		while(low < high && a[low] <= pivotkey)
			low++;               // 将比枢轴记录大的记录移到高端
		a[high]=a[low];
	}
	a[high] = pivotkey;               //枢轴记录到位
	return low; 
} 
void Qsort(int low,int high)
{
	if(low < high)      //长度 > 1 
	{
		int pivoloc = Partition(low,high);   //将其一分为二 
		Qsort(low,pivoloc-1);                //对左半部分进行递归排序,pivoloc是枢轴位置 
		Qsort(pivoloc+1,high);               //对右半部分进行递归排序 
	}
}
int main()
{
	int i; 
	Qsort(0,8);
	for(i=0;i<9;i++)
    	printf("%d ",a[i]);
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值