因为近期要准备校招面试,所以将严蔚敏版本号的《数据结构》又拿过来温习一遍,应该看了不下于5遍了吧,呵呵,当中多少遍无所谓,关键是得亲自己主动手去调试,才有新发现。
本篇博文就来整理下经典的排序算法(未完待续...)
不凝视的代码说明不是必需凝视啊~
/* ========================================================== 数据结构经典算法合集 ========================================================== By gujj 20140727 */ #include <iostream> #include<cstdlib> #include<ctime> using namespace std; #define N 8 /*----------------------------------------------------------------- * void RandNum(int *List) * ----------------------------------------------------------------- * 随机数生成函数 */ void RandNum(int *List) { // 用于保证是随机生成的数 // 不同的种子能够生成不同的随机数 srand((unsigned)time(NULL)); // srand((unsigned)time(0)); for(int i=0; i<N; i++) { List[i] = rand()%N; } } /*----------------------------------------------------------------- * void OutPut(int* List) * ----------------------------------------------------------------- * 输出函数 */ void OutPut(int *List) { for(int i=0; i<N;i++) cout<<List[i]<<" "; cout<<endl; } /*----------------------------------------------------------------- * void InsertSort(int* List) * ----------------------------------------------------------------- * 插入排序 */ void InsertSort(int *List) { // key, int key,i,j; for(i=1; i<N; i++) { key = List[i]; j = i-1; while(j>=0 && key < List[j]) { List[j+1] = List[j]; --j; } List[j+1] = key; } } /*----------------------------------------------------------------- * void QSort(int *List, int low, int high) * ----------------------------------------------------------------- * 高速排序 */ // 一趟排序 int Partition(int *List, int low, int high) { int key = List[low]; while(low < high) { // 若 high位置的值不比key值小。则不是必需移动 while( low < high && List[high] >= key) --high; List[low] = List[high]; // 若 low位置的值不比key值大,则不是必需移动 while( low < high && List[low] <= key) ++low; List[high] = List[low]; } List[low] = key; return low; } void QSort(int *List, int low, int high) { int pivot; if(low < high) { // 获取中轴值 pivot = Partition(List,low,high); // 中轴左边排序 QSort(List,low,pivot-1); // 中轴右边排序 QSort(List,pivot+1,high); } } /*----------------------------------------------------------------- * void HeapSort(int *List, int low, int high) * ----------------------------------------------------------------- * 堆排序 */ // 堆筛选 void HeapAdjust(int *List, int s, int e) { // 已知 L[s-e]中的keyword。除L[s]之外均满足大顶堆的定义 // 本函数实现调整L[s]使L[s-e]符合大顶堆定义,即筛选 int key = List[s]; for(int i = 2*s; i<=e; i*=2) { // 选取较大孩子节点向下筛选 if(i<e && List[i]<List[i+1]) ++i; // 若 key 比最大的孩子List[i]还大,符合大顶堆定义 // 此时,key应该放置在 s 位置上 if(key >= List[i]) break; // 若 key 比 最大的孩子小。将最大孩子置换到顶端 List[s] = List[i]; s = i; } // 将 key 放入正确的位置 List[s] = key; } void HeapSort(int *List) { int tmp; // 从 N/2位置 開始向前调整。即比較相关的孩子结点。调整为大顶堆 for(int i = N/2; i>=0; --i) HeapAdjust(List,i,N-1); // 对大顶堆 List顺序表 进行堆排序,得到的顺序表为升序序列 for(int i = N-1; i>0; --i) { // 将堆顶的元素List[0]和未排序的子序列List[1 - N-1]中最后一个元素置换 tmp = List[0]; List[0] = List[i]; List[i] = tmp; // 将序列 List[0 - i-1]进行筛选 HeapAdjust(List,0,i-1); } } /*----------------------------------------------------------------- * int main(int argc, char *argv[]) * ----------------------------------------------------------------- * 主函数 */ int main(int argc, char *argv[]) { // 计时函数 clock_t t_start,t_end; int List[N]; // 调用随机函数并初始化数组 RandNum(List); OutPut(List); // 開始计时 t_start=clock(); // 调用算法函数 cout<<"Insert Sort:"<<endl; InsertSort(List); OutPut(List); cout<<"Quick Sort:"<<endl; QSort(List,0,N); OutPut(List); cout<<"Heap Sort:"<<endl; HeapSort(List); OutPut(List); // 结束计时 t_end=clock(); cout<<"The needed time:"<<difftime(t_end,t_start)<<endl; return (0); }
用g++编译器运行,有例如以下结果(注:数据是採用随机函数生成。通过设置N大小来定义):
king@king-desktop:/var/test/Algo$ ls insertSort.cpp test.sh king@king-desktop:/var/test/Algo$ sh test.sh 1 6 0 3 7 4 4 4 Insert Sort: 0 1 3 4 4 4 6 7 Quick Sort: 0 1 3 4 4 4 6 7 Heap Sort: 0 1 3 4 4 4 6 7 The needed time:0 king@king-desktop:/var/test/Algo$ cat test.sh #!/bin/sh g++ -o test insertSort.cpp ./test rm -rf test king@king-desktop:/var/test/Algo$