快速排序(浅学)

晚上终于收到阿里那个人的电话了,聊了一个来点,我在楼道里接的电话,好冷呜呜。配置管理部门?没听说过,听了老半天还是没怎么明白到底做什么工作。其实对方还是很耐心地一直在跟我解释,也问了我一些项目上的东西,答得还凑合吧。其实我最关心的还是能在实习中学到多少东西,能近距离地接触大公司还是不小的诱惑的。毕竟那是绝大多数IT人的梦想。

下午到晚上花了快一个多点才把快排调对了。总算正规地用了一次CB里的调试工具,嗯,感觉还不错。最后才发现一直没调出来导致死循环的错误出在Partition函数。没有处理只有子序列两个数据的情况。所以陷入了死循环。而且还是犯了好多低级错误。比如在找分界值的时候忘了下标自加之类的难过。感叹码力还是有待提高啊。边敲的时候就边在困惑:大二软设的时候为什么不好好敲呢?明明都是很有趣的算法啊。好吧,回不去了。还是好好学习吧。

把今天写的代码贴出来。此外,还有几个问题需要研究:1、这个算法的复杂性分析;2、分界值的选取。我按照学校的教材处理,是把最先找到的两个不一样的元素中的较大值作为分界值的。略微翻了一下《算法导论》,好像处理方法不一样。明天抽时间好好研究下那本书里的吧。Anyway,快排还是在排序中举重若轻的算法,要尽量学透。


#include <iostream>
#include "swap.h"
using namespace std;
#define MAX 35
#define MIN 0

int a[MAX];
int FindPivot(int i, int j)//找到分界的数值
{
    int key ;
    int k = i;
    while(k < j)
    {
        if(a[k] > a[k + 1]){ key = a[k];break;}
        else if(a[k] < a[k + 1]){ key = a[k + 1];break;}
        else key = 0;
        k ++;
    }
    return key;
}

int Partition(int i, int j, int key)
{
    int l = i, r = j;
    do
    {
        swap(a[l], a[r]);
        cout<<a[l]<<" "<<a[r]<<endl;
        while(a[l] < key)
            l ++;
        while(a[r] >= key)
            r --;
    }while(l < r);
    return (l - 1);
}

int QuickSort(int i, int j)
{
    if(i < j)
    {
        int k, m;
        k = FindPivot(i, j);
        if(k != 0)
        {
            m = Partition(i, j, k);
            QuickSort(i, m);
            QuickSort(m + 1, j);
        }
    }
    else ;
    return 0;
}


int main()
{
    int i;
    for(i = MIN;i < MAX; i ++)cin >> a[i];
    QuickSort(MIN, MAX - 1);
    int n;
    for(n = MIN;n < MAX;n ++)
    cout <<"the " << n <<"number is: "<< a[n] << endl;
    return 0;
}

测试用例:12 3 4 9 7 6 8 11 2 1 5 10 16 14 15 20 0 13 4 7 23 2 1 0 3 5 9 7 56 54 34 57 12 13 1


好困了,明天继续战斗。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值