排序-快速排序

来源:互联网 发布:怎样在淘宝上买到正品 编辑:程序博客网 时间:2024/06/05 16:19

时间:

快排就平均时间而言,可以算是内部排序中最好的一种。其平均时间复杂度O(nlog(n)),但是若初始序列基本有序,则快排退化为冒泡排序,时间复杂度O(n^2)。

针对这种情况的改进方法一是用“三者取中”来选取枢轴记录,即比较arr[low],arr[high],arr[(low+high)/2],取中间值为枢轴记录,此法可以改善在最坏条件下的性能。

方法二是改进一次划分函数Partition,标记出此次划分是否有进行记录间的交换,若没有,则表示其已经是有序的,其子序列也不需要排序。

空间:

快排除了需要一个记录的辅助空间之外,还需要栈空间来时间递归算法,平均深度为[log2(n)]+1,最坏为n。改进方法为,在一趟排序之后,比较两个子序列的长度,先处理短的一个,再处理长的一个,则可以把最大深度降为log(n)。


一下为普通的快排

#include <iostream>#include <stdlib.h>using namespace std;#define LIST_INIT_SIZE 10#define  LISTINCREMENT 5#define FALSE 0#define TRUE 1#define ERROR 0#define OK 1#define INFEASIBLE -1typedef int Status;typedef int ElemType;typedef Status (*Compare)(ElemType x,ElemType y);typedef Status (*Visit)(ElemType* x);typedef struct  {ElemType*elem;intlength;intlistsize;}SqList;Status CreatSqList(SqList* sql);Status DestroySqList(SqList* sql);Status InsertSqList(SqList* sql,int i,ElemType e);int Partition(SqList*sql,int low,int high);void QSort(SqList*sql,int low,int high);void QuickSort(SqList*sql);void PrintSqList(const SqList* sl);int main(void){SqList sql;CreatSqList(&sql);InsertSqList(&sql,1,5);InsertSqList(&sql,1,2);InsertSqList(&sql,1,4);InsertSqList(&sql,1,8);InsertSqList(&sql,1,3);InsertSqList(&sql,1,10);PrintSqList(&sql);QuickSort(&sql);PrintSqList(&sql);DestroySqList(&sql);return 0;}int Partition(SqList*sql,int low,int high){ElemType pivot=sql->elem[low];while (low<high){while (low<high&&sql->elem[high]>=pivot){high--;}sql->elem[low]=sql->elem[high];while (low<high&&sql->elem[low]<=pivot){low++;}sql->elem[high]=sql->elem[low];}sql->elem[low]=pivot;return low;}void QSort(SqList*sql,int low,int high){int pivotloc;if (low<high){pivotloc=Partition(sql,low,high);QSort(sql,low,pivotloc);QSort(sql,pivotloc+1,high);}}void QuickSort(SqList*sql){QSort(sql,0,sql->length-1);}Status CreatSqList(SqList* sql){sql->elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if (sql->elem==NULL){return OVERFLOW;}sql->length=0;sql->listsize=LIST_INIT_SIZE;return OK;}Status DestroySqList(SqList* sql){free( sql->elem);sql->length=0;sql->listsize=0;return OK;}Status InsertSqList(SqList* sql,int i,ElemType e){if (sql->elem==NULL){return ERROR;}if (i<1||i>sql->length+1){return ERROR;}if (sql->length>=sql->listsize){sql->listsize+=LISTINCREMENT;sql->elem=(ElemType*)realloc(sql->elem,sql->listsize*sizeof(ElemType));}for (int j=sql->length;j>=i;j--){sql->elem[j]=sql->elem[j-1];}sql->length++;sql->elem[i-1]=e;return OK;}void PrintSqList(const SqList* sql){cout<<endl<<"SqList:"<<endl;for (int i=0;i<sql->length;i++){cout<<sql->elem[i]<<" ";if ((i+1)%10==0){cout<<endl;}}}

运行结果入下图:




0 0