快速排序的实现方法

8 篇文章 3 订阅
3 篇文章 0 订阅

1、什么是快速排序

        快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。

        总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序作了下白话解释,希望对大家理解有帮助,达到快速排序,快速搞定。

        快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。

2、快速排序基本思维

该方法的基本思想是:

1.先从数列中取出一个数作为基准数。

2.将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

3.重复回调函数本身,直到需要排序的区间大小为1时排序结束。  

3、快速排序的基本流程

         循环进行以上步骤,直到left和right相等为止。

        我们完成一次排序之后,会得到以下的结果

        如此,如果要实现98前面部分的排序和后面部分的排序,我们就只需要循环调用本函数,直到最后排序长度为1为止。

        

4、代码示例

#include <stdio.h>

//计算数组元素个数
int Cal_Len(int *arr)
{
	int len = 0;
	
	while(*arr != -1){
		len++;
		arr++;
	}
	return len;
}


//快速排序
void QKSORT(int *arr, int len)
{
	if(len < 2){
			return;
	}
	
	int store = *arr;
	int left = 0;//左边
	int right = len-1;//右边
	int i = 0;
	
	while(left != right){
		while(*(arr + right) > store){
			right--;
		}
		while(*(arr + left) < store){
			left++;
		}
		int tmp = *(arr + right);
		*(arr + right) = *(arr + left);
		*(arr + left) = tmp;	
	}
	
	QKSORT(arr, left);
	QKSORT(arr+right+1, len - right - 1);
}

int main()
{
	int arr[100] = {98, 999, 68, 99, 360, 58, 198, 48, 468, 21, 78, 668, -1};
	int len = 0;
	
	len = Cal_Len(arr);
		
	for(int i = 0; i < len; i++){
		printf("%d ", arr[i]);
	}
	printf("\n");
	

	printf("len = %d\n", len);
	
	QKSORT(arr, len);
	
	for(int i = 0; i < len; i++){
		printf("%d ", arr[i]);
	}
	printf("\n");
	
	return 0;
}

5、结果分析

       我们初始化的数组中使用了-1来标识该位置是否为空,如果检测为-1,则长度计算停止,返回数组长度,将长度传进快速排序的函数内部执行时,需要注意,每次回调函数的长度都需要进行原有长度的计算,一定不要将变量换成具体的数值。

好的,以上就是今天的内容了!!!

欢迎大家参考指正!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玖尾猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值