简单快速排序法(C语言)

本文详细介绍了快速排序算法的工作原理,通过选取基准点并进行分区操作,递归地对子序列进行排序,以升序为例,以C语言代码展示了如何实现这一过程。
摘要由CSDN通过智能技术生成

我认为简单快速的排序的原理是:

此处以升序为例

选取一个基准点 q (起到中间变量的作用),

把小于这个基准点 q 的元素全部排到q的左边,

把大于这个基准点 q 的元素全部排到q的右边 , 

接着对q左边的序列重复操作,

即选取基准q1,

把小于q1的元素全部排到q1左边

把大于q1的元素全部排到q1右边

对q左边的序列也是如此

如此反复反复反复(很明显,这是我们熟悉的循环,递归操作)

接下来让我们看看具体如何实现

——————————————————

给出一个乱序整型数组  int  a[7] = { 5 ,7 ,3 ,0 ,4 ,8 ,6 };

一般情况下我们选取第一个元素作为基准点q(当然基准点的选取是随机的)

1.比较a[ r ] = 6与 q = 5 的大小 , 如果a[ r ]>=q , 那么a[ r ]应该放 q 的右边

而a[ r ] = 6现在就在 q = 5 的右边 ,所以我们继续比较下一位

2.比较a[ r ] = 8与 q = 5 的大小 , 如果a[ r ]>=q , 那么a[ r ]应该放 q 的右边

而a[ r ] = 8现在就在 q = 5 的右边 ,所以我们继续比较下一位

3.比较a[ r ] = 4与 q = 5 的大小 , 如果a[ r ]>=q , 那么a[ r ]应该放 q 的右边

此时a[ r ] = 4 < q = 5 ,如果l < r (即l 与 r 没有相遇),

就把a[ r ] = 4利用 a[ l ] 移动到 q 的右边,即a[ l ] = a[ r ]

可能有的小伙伴看到表格会疑惑那元素5不是没有了嘛,

这时候想一想我在最前面说了q起到一个中间变量的作用,5一直存在q里面

4.r先移动,r一直向左移动,直到出现小于q的值或者l = r , 如果出现小于q的值且l < r

让a[ l ] = a[ r ]后 , 就该l开始移动(这里先解释一下基本流程,4步之后就自己看表格吧)

下标0123456
q = 55730486
l = 0 , r = 6   6 > 5   r- -lr
l = 0 , r = 5   8 > 5   r- -lr

l = 0 ,r = 4    4 < 5   a[ l ] = a[ r ]

a[ 0 ] = a[ 4 ] 

lr
下标0123456
变化之后的数组4730486

此时l = 0 , r = 4

(r- - 结束后 ,l++)

lr

l = 1 , r = 4 , 7 > 5 , a[ r ] = a[ l ]

a[ 4 ] = a [ 1 ]

lr
下标0123456
变化之后的数组4730786

此时l = 1 , r = 4

(l++ 结束后 ,r - -)

lr

l = 1 , r = 3 , 0 < 5 , a[ l ] = a[ r ]

a[ 1 ] = a [ 3 ]

lr
下标0123456
变化之后的数组4030786

此时l = 1 , r = 3

(r- - 结束后 ,l++)

lr

l = 2 , r = 3 , 3 < 5 , l++

lr

此时l = r ,a[ l ] = q , 把q装在

l = r 的位置

l r
下标0123456
变化之后的数组4035786

此时就实现了比q = 5小的元素全在q的左边,比q = 5大的元素全在q的右边

然后对于5左边的序列进行重复操作,对于5右边的序列进行重复操作,

4 0 3 ---->  3 0 4                    7 8 6 ----> 6 7 8

3 0  ---->  0 3                         6 7   ---->  6 7

----->0 3 4                              ----->6 7 8

                   ----->0 3 4 5 6 7 8

代码如下

```C
void quicksort(int a[],int L,int R){
	if(L>=R){
		return ;
	}
	int l = L,r = R,q;
	q = a[l];//基准值
	while(l<r){
		while(l<r&&a[r]>=q){//当a[r]>=q时,r左移
			r--;            
		}
		if(l<r){
			a[l] = a[r];
		}
		while(l<r&&a[l]<=q){//当a[l]<=q时,l右移
			l++;
		}
		if(l<r){
			a[r] = a[l];
		}
		if(l>=r){ //l和r相等的位置就是q值应该存放的位置
			a[r] = q;//一轮快速排序也可以理解成挑出一个基准点,然后
		}            //通过不断地与其他元素比较大小找到它应该在的位置
	}
	quicksort(a,L,r-1);//对q左边的元素进行重复操作[L,r-1]为左区间
	quicksort(a,r+1,R);//对q右边的元素进行重复操作[r+1,R]为右区间
}
```

  • 35
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值