算法之快速排序

算法之快速排序

这个算法的重点其实是在设置基准数,以及从两边开始向中间走,经过的数与基准数作比较。右边设置下标j,需要优先开始进行向左的遍历,直到找到一个比基准数小的数,否则j–;左边设置下标i,向右遍历,直到找到比基准数大的数,否则i++。此时注意限制条件i必须在j左边,也就是说,i<j,交换i、j对应的数。如果i、j相遇,则将相遇位置的数与基准数交换,这算是完成了第一趟。使得基准数左边的都比基准数小。这种排序方法,每一趟都有一个数可以归位(即基准数可到达正确的位置)。然后再采用递归,将基准数左右两边分别看作两个待排序的子问题,重新设置最左的数为基准数然后排序。

#include <iostream>
using namespace std;
int a[100], n;//全局变量不要在函数里面再去定义了!否则这个全局变量和函数里面的变量就是两个变量!
bool swap(int &a, int &b)
{
    int i;
    i = a;
    a = b;
    b = i;
    return true;
}
bool quicksort(int left, int right)
{
    if (left > right)
        return true;
    int i, j, k;
    k = a[left];
    i = left;
    j = right;
    while (i != j)
    {
        while (j > i && a[j] >= k)//一定是j先行!
            j--;
        while (j > i && a[i] <= k)
            i++;
        swap(a[i], a[j]);
    }
    swap(a[left], a[i]);
    quicksort(left, i - 1);
    quicksort(i + 1, right);
}//整个过程里left和right一直是整个数组开头和结尾的下标没有变过。
int main()
{
    int i;
    cout << "Please enter the number of the numbers:" << endl;
    cin >> n;
    cout << "Please eeter the numbers:" << endl;
    for (i = 0; i < n; i++)
        cin >> a[i];
    quicksort(0, n - 1);
    for (i = 0; i < n; i++)
    {
        cout << a[i] << '\0';
    }
}

这是自己写了第二遍的,本来想画个图来记录一下,但是今天做数学花了太多时间惹!TT!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值