快速排序-1

快速排序-1

前言:

相信大家对基础的冒泡选择插入都有了解,我就先不说这三种。我今天要说的是有点陌生的快速排序,希望大家能有所收获。

正文:

基本思想:

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

简单来说就是找一个数(一般是开头那个)做基准值,一轮操作后,比基准值大的在它右边,比它小的在左边,然后再对剩余部分再进行同样算法。

如何操作:

先进行一轮操作把:

看这10个数字

5, 3, 9, 4, 8, 6, 2, 0, 1, 7

1.选取5为基准值

2.从右开始往左遍历,如果比5大,不操作,若比5小,就和5交换,交换之后停止遍历,并且记录该位置

得到1, 3, 9, 4, 8, 6, 2, 0, 5, 7

3.然后从左开始往右遍历,如果比5小,不操作,若比5大,就和5交换,交换之后停止遍历,记录该位置

得到1, 3, 5, 4, 8, 6, 2, 0, 9, 7

在上述记录的位置开始再重复2和3,直到记录的位置相同,算法停止,一轮操作结束。

依次得到

1,3,0,4,8,6,2,5,9,7

1,3,0,4,5,6,2**,8**,9,7

1,3,0,4,2,6,5,8,9,7

1,3,0,4,2,5,6,8,9,7

这时,比5小的都在左边,比5大的都在右边。

其实你有没发现我们也可以不用真的去交换5这个数,只要知道5的位置就好了,到最后再补上也可。

1, 3, 9, 4, 8, 6, 2, 0, 1, 7

1, 3, 9, 4, 8, 6, 2, 0, 9, 7

1,3,0,4,8,6,2,0,9,7

1,3,0,4,8,6,2,8,9,7

1,3,0,4,2,6,2,8,9,7

1,3,0,4,2,5,6,8,9,7

这个可能不好理解,建议连着代码一起看

附上代码


//进行一轮操作
#include <cstdio>
#include <iostream>
using namespace std;
int a[10] = {5, 3, 9, 4, 8, 6, 2, 0, 1, 7};
void quicksort_one(int a[10], int l, int r)
{
    if (l < r)
    {
        int left = l;
        int right = r;//初始位置记录
        int t = a[l];
        while (left < right)
        {
            while (left < right && a[right] >= t)
            {
                right--;
            }
            if (left < right)
            {
                //a[right] = t;
                a[left] = a[right];
                left++;
            }
            while (left < right && a[left] <= t)
            {
                left++;
            }
            if (left < right)
            {
                //a[left]=t;
                a[right] = a[left];
                right--;
            }
        }
        a[left] = t;//最后补上空
    }
}
int main()
{
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", a[i]);
    }
    quicksort_one(a, 0, 9);
    printf("\n");
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", a[i]);
    }
    return 0;
}


运行结果

5 3 9 4 8 6 2 0 1 7

1 3 0 4 2 5 6 8 9 7

接下来是递归调用:

其实就是和二叉树顺序查找类似。

附上代码


#include <cstdio>
#include <iostream>
using namespace std;
int a[10] = {5, 3, 9, 4, 8, 6, 2, 0, 1, 7};

void quicksort(int a[10], int l, int r)
{
    if (l < r)
    {
        int left = l;
        int right = r;
        int t = a[l];
        while (left < right)
        {
            while (left < right && a[right] >= t)
            {
                right--;
            }
            if (left < right)
            {
                
                a[left] = a[right];
                //a[right] = t;
                left++;
            }
            while (left < right && a[left] <= t)
            {
                left++;
            }
            if (left < right)
            {
                
                a[right] = a[left];
                //a[left]=t;
                right--;
            }
        }
        a[left] = t;
        quicksort(a, l, right - 1);//递归
        quicksort(a, right + 1, r);//递归
    }
}

int main()
{
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", a[i]);
    }
    quicksort(a, 0, 9);
    printf("\n");
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", a[i]);
    }
    return 0;
}

运行结果

5 3 9 4 8 6 2 0 1 7

0 1 2 3 4 5 6 7 8 9

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值