算法之从零开始——排序

算法之从零开始——排序

一、 快速排序

快排几乎是应届生面试种算法方面必问的,不是问你实现的方法,就是叫你在纸上写实现的代码。

快排采用的思想是分治思想,例如这个博客说的一样https://www.cnblogs.com/codeskiller/p/6360870.html

一、算法概述/思路

快速排序一般基于递归实现。其思路是这样的:

1.选定一个合适的值(理想情况中值最好,但实现中一般使用数组第一个值),称为“枢轴”(pivot)。

2.基于这个值,将数组分为两部分,较小的分在左边,较大的分在右边。

3.可以肯定,如此一轮下来,这个枢轴的位置一定在最终位置上。

4.对两个子数组分别重复上述过程(递归),直到每个数组只有一个元素。

5.排序完成。

举例:

一个需要排序的数组

2  0  3  6  4  5  1

然后我们有2个指针,一个为first指向第0位,一个为last指向最后一位。

我们选择第一位为“枢轴”,称为key。所以key=2

然后从last指针起 (最右边起),选择小于key值的(1),复制放到first指向的位置也就是第0位,first、last指针都没有进行位移,现在结果就成了

1  0  3  6  4  5  1

然后从first指针起(最左边起),需要选择大于key值的,复制放到last指向的位置也就是第6位。因为第0位的1和第1位的0不符合,都<2,则first指针就向右边移动找到了数字3,则first指针为2,last为6.结果就成了

1  0  3  6  4  5  3

接下来,继续,从last指针起(3),选择小于key值的,由于都不符合,都>2,last指针就向左边移动一直移动一直到和first重叠,结果就成了

1  0  3(3)  6  4  5  3

first和last重合的这时,就完成了递归循环的一组,把重合的这一位赋值为key。就变成了

1  0  2  6  4  5  3

此时2的左边就都是小于2的,2的右边就都是大于2的。就可以进行递归了,以2为中心分为左右两组继续上面的步骤。

递归使用只要有退出的条件就行了,那自然是”first和last重合”。

 

二、代码实例
#include<stdio.h>
void Qsort(int a[], int low, int high)//传入的是要排序数组的
{
    if(low >= high)/*递归的退出条件*/
    {
        return;
    }
    int first = low;
    int last = high;
    int key = a[first];/*用字表的第一个记录作为枢轴*/

    while(first < last)
    {
        while(first < last && a[last] >= key)
        {
            --last;
        }

        a[first] = a[last];/*将比key小的移到低端*/

        while(first < last && a[first] <= key)
        {
            ++first;
        }

        a[last] = a[first];/*将比key大的移到高端*/
    }
    a[first] = key;/*枢轴记录到位*/
    Qsort(a, low, first-1);/*递归左边的数组*/
    Qsort(a, first+1, high);/*递归右边的数组*/
}

int main()
{
    int a[10]={2,0,3,7,6,4,5,9,8,1};
    Qsort(a,0,9);
    int n;
    for(n=0;n<10;n++)
    {
        printf("%d %d\n",n,a[n]);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值