快速排序思想及C语言代码

本文详细介绍了快速排序的基本思想和实现过程,提供了两种不同的实现方法,并对比了其与冒泡排序的区别,强调了快速排序的高效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速排序的思想(以从小到大为例)

(1)第一次排序

选取数组内的一个元素作为标准,将数组分为两部分;将小于该标准的元素存放在该标准的左边,大于该标准的元素放在右边,完成第一次排序;

(2)第二次排序

对分割后的两部分数组分别进行排序(递归的调用)。

基本方法

1)创建函数,传递的参数分别是数组的地址数组首个元素的位置数组元素的末位置

2)在函数中声明三个变量xbeginendx用来取为标准元素beginend分别用来接收传参的后两个数值作为记录循环的位置);

3)我先将数组的首个元素作为标准元素(即x=str[begin]),先从数组的末位置开始与x进行比较,如果小于x则进行交换;再从数组的首位置开始与x进行比较,如果大于x则进行交换,直到begin>=end;完成第一次排序;

4)前三个步骤完成后,数组被分为两部分:一部分是小于标即准元素,一部分是大于标准元素。将左右两部分分别进行排序(即调用创建的函数),完成第二次排序。


例:待排序的数组str:42,25,56,34,21

#include<stdio.h>
#include<stdlib.h>
void QuickSort(int str[],int i,int j)
{
	int begin=i,end=j;
	int x=str[i];
	if(begin<end)
	{			
		while(begin<end)
		{
			while(begin<end&&str[end]>x)
			end--;
			if(begin<end)
			str[begin++]=str[end];
			while(begin<end&&str[begin]<x)
			begin++;
			if(begin<end)
			str[end--]=str[begin];
		}
		str[begin]=x;
		QuickSort(str,i,end-1);//用递归将选取的标准数左右两边都进行排序
		QuickSort(str,begin+1,j);
	}
}
int main()
{
	int str[5]={42,25,56,34,21};
	int i=0,j=4;
	QuickSort(str,i,j);
	for(i=0;i<5;i++)
	printf("%3d",str[i]);
}


基本方法2

第二种方法与第一种方法的思路大致相同,两者的区别在于交换数据的时候,第一种是先在右边开始找到第一个交换的数字,在交换后再从左边进行交换,通过x记录了被覆盖的str[0],直到i=j;第二种方法因为选择的也是str[0]作为标准,然后也是右边即end先走找到小于str[0]的数字后,begin再开始走,直到找到大于str[0]的数字,用三步法进行交换,这种方法比较简单易懂。

例:待排序的数组str:42,2556,34,21

#include<stdio.h>
#include<stdlib.h>
void QuickSort(int str[],int i,int j)
{
	int begin=i,end=j;
        int x=str[i];
        if(begin > end) return;
	while(begin<end)
	{
		while(begin<end&&str[end]>x)
		end--;
		while(begin<end&&str[begin]<x)
		begin++;
		if(begin<end)
		{
			int temp=str[end];
			str[end]=str[begin];
			str[begin]=temp;
		}
		QuickSort(str,i,begin - 1);
		QuickSort(str,end + 1,j);
	}
}
int main()
{
	int str[]={42,25,56,34,21};
	int i=0,j=4;
	QuickSort(str,i,j);
	for(i=0;i<5;i++)
	printf("%3d",str[i]);
	return 0;
}



快速排序的作用

相对于冒泡排序而言,每次交换都是跳跃式的,不像冒泡排序一样只能在相邻的两个数之间进行交换,交换的次数较少,提高了程序的运行速度。在最差的情况下,时间复杂度仍和冒泡排序一样是O(N^2),但是平均复杂度O(NlonN)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值