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