浅议快速排序及优化

本文探讨了快速排序的基本概念,详细介绍了从1方案到2方案的排序过程,并重点讨论了快速排序的优化方法,旨在提升排序效率。
摘要由CSDN通过智能技术生成
 最近觉得自己C学的太恶心了,回头补漏,先看递归,结果递归的例子就是快速排序,看完大神贴后,发一下所获。

快速排序的概念


注:为了方便起见,以从小到大排序为例,后面不再赘述。


首先从数组中选一元素,把其小的全部放在左边,大的放在右边,但小的部分和大的部分各自仍是无序的,此时称为一趟快速排序,之后左右部分分别递归下去,直到全部有序。

从概念中已经知道,这个每次选定的元素对于排序的快慢其决定性影响,如果恰好每次选定的都是最大值,那就和冒泡排序没两样了。

快速排序方法

一趟快速排序有两种方案:
1.从一端开始,把小的扔到左边
2.从两端同时开始,向中间走,小的扔到左边,大的扔到右边;
显然2优于1

基础从1方案讲起


1>设定两个变量last,i存放数组下标,开始两数值都为当前最左端+1(即避开第一个特殊元素)(因为递归开始时,最左端值不一定为0),
2>i循环遍历整个数组,每次判断若当前数比last位置的数小,则++last,交换i与last的值,循环结束时交换last与最左端的值(即特殊元素),完成一趟快速排序
3>以last位置为界,递归左边,递归右边
#include <unistd.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
//测试十万个无序随机数的数组
#define MAX 100000        

//随机数生成
void my_srand();
void my_rand(int max);
void rand_data(int a[], int max);

//真正快速排序函数
void my_qsort(int v[], int left, int right);

//用于打印排序前后的值
void prtn(int a[], int n);
void swap(int v[], int i, int j);

int main(int argc, char *argv[])
{
int a[MAX];


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值