【数据结构笔记】7:非递归快速排序

来源:互联网 发布:网狐6603源码 网盘 编辑:程序博客网 时间:2024/06/05 09:23

快速排序,分而治之。在同为O(N*logN)的几种排序方法中效率较高。

*递归和非递归的快排

#ifndef __QUICK_SORT_H__#define __QUICK_SORT_H__#include "Assistance.h"// 辅助软件包#include <queue>template <class ElemType>void QuickSort(ElemType elem[], int low, int high, int n)// 操作结果:对数组elem[low .. high]中的元素进行快速排序{    ElemType e = elem[low];// 取枢轴元素     int i = low, j = high;while (i < j){while (i < j && elem[j] >= e)// 使j右边的元素不小于枢轴元素j--;if (i < j)            elem[i++] = elem[j];while (i < j && elem[i] <= e)// 使i左边的元素不大于枢轴元素i++;if (i < j)            elem[j--] = elem[i];}elem[i] = e;    cout << "排序区间:" << low << "--" << high << ";中枢位置为:" << i << endl;     Display(elem, n);    cout << endl;    if (low < i-1)QuickSort(elem, low, i - 1, n);// 对子表elem[low, i - 1]递归排序if (i + 1 < high) QuickSort(elem, i + 1, high, n);// 对子表elem[i + 1, high]递归排序}template <class ElemType>void sort(ElemType elem[],int a,int b)//直接比较完成排序a~b{bool flag=1;while(flag==1){flag=0;for(int i=a;i<b;i++){if(elem[i]>elem[i+1]){swap(elem[i],elem[i+1]);flag=1;}}}}void swap(int &a,int &b){int c;c=a;a=b;b=c;}template <class ElemType>void Lzh(ElemType elem[],int low,int high,int n)// 操作结果:对数组elem[low .. high]中的元素进行快速排序{queue<int> myQue;//只存游标int a,b,c;//as helpermyQue.push(low);myQue.push(high);while(!myQue.empty()){//出队两个游标a=myQue.front();myQue.pop();b=myQue.front();myQue.pop();//取游标中点c=(a+b)/2;//选择a,b,c中elem值居中的为cif(elem[a]<elem[b]&&elem[b]<elem[c] || elem[c]<elem[b]&&elem[b]<elem[a])c=b;else if(elem[b]<elem[a]&&elem[a]<elem[c] || elem[c]<elem[a]&&elem[a]<elem[b])c=a;//否则c就是cElemType e = elem[c];// 取枢轴元素int i = a, j = b;swap(elem[c],elem[i]);//和第一个交换while (i < j){while (i < j && elem[j] >= e)// 使j右边的元素不小于枢轴元素j--;if (i < j){elem[i++] = elem[j];}while (i < j && elem[i] <= e)// 使i左边的元素不大于枢轴元素i++;if (i < j){elem[j--] = elem[i];}}elem[i] = e;/*cout << "排序区间:" << a << "--" << b << ";中枢位置为:" << i << endl; Display(elem, n);cout << endl;*/if((b-i)>(i-a))//较短的先入队{if(i-a<=3)//很短直接比较完成排序sort(elem,a,i-1);else//否则还是要入队{myQue.push(a);myQue.push(i-1);}if(b-i<=3)//很短直接比较完成排序sort(elem,i+1,b);else//否则还是要入队{myQue.push(i+1);myQue.push(b);}}else//(b-i)<=(i-a),则先b-i{if(b-i<=3)//很短直接比较完成排序sort(elem,i+1,b);else//否则还是要入队{myQue.push(i+1);myQue.push(b);}if(i-a<=3)//很短直接比较完成排序sort(elem,a,i-1);else//否则还是要入队{myQue.push(a);myQue.push(i-1);}}}}#endif

*测试

#include "QuickSort.h"// 快速排序算法#include <time.h>int main(void){int a[10000];int n=10000;for(int i=0;i<n;i++){a[i]=rand()%100;}cout << "排序前:"<<endl;Display(a, n);time_t start=clock();Lzh(a, 0, n - 1, n);//非递归实现快排的函数//QuickSort(a, 0, n - 1, n);time_t finish=clock();double k=(double)(finish-start)/CLOCKS_PER_SEC;Display(a, n);cout << "排序用时:"<<k<<endl;system("PAUSE");return 0;}

部分运行结果:





原创粉丝点击