首页 > 代码库 > 数据结构之快速排序
数据结构之快速排序
1.快速排序思想
快速排序基本思想是:通过一趟排序将序列分成独立的两部分,其中一部分的关键字都小于或都大于另一部分的关键字,则可以对这两部分记录继续排序,达到整个序列有序位置。假设待排序记录a1,a2...an,n个记录,首先任意选取一个记录作为轴pivot,将比它小的记录放到其左边,将比它大的记录放到其右边,这成为一趟排序。然后将左右两部分通过上述规则递归排序。
2.快速排序代码实现
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4 #define MAXSIZE 100000000 5 #define INCREMENTNUM 200000 6 #define EQ(a,b) ((a)==(b)) 7 typedef struct List{ 8 int*elem; 9 int length; 10 int size; 11 }List; 12 13 void initList(List &list) 14 { 15 list.elem=(int*)malloc(sizeof(int)*(MAXSIZE+1)); 16 if(!list.elem){ 17 printf("%s\n","初始化失败"); 18 exit(0); 19 } 20 list.length=0; 21 list.size=MAXSIZE; 22 printf("%s\n","初始化成功"); 23 } 24 25 void insert(List &list ,int value) 26 { 27 if(list.length>=list.size){ 28 list.elem=(int*)realloc(list.elem,sizeof(int)*(list.length+INCREMENTNUM)); 29 if(!list.elem){ 30 printf("%s\n","内存重新分配失败"); 31 exit(0); 32 } 33 printf("%s\n","内存重新分配成功"); 34 list.size+=INCREMENTNUM; 35 } 36 list.elem[++list.length]=value; //第一从1开始 37 //printf("%d%s 位置:%d\n",value,"\t插入成功",list.length); 38 } 39 40 int search(List list,int key) 41 { 42 list.elem[0]=key; 43 int i; 44 long start=clock(); 45 for(i=list.length;!EQ(list.elem[i],key);i--); 46 long end=clock(); 47 printf("耗时:%lf 秒\t%s\n",(double)(end-start)/1000,"查找完成"); 48 return i; 49 } 50 51 void printList(List list) 52 { 53 //printf("共%d数据\n",list.length); 54 int i; 55 for(i=1;i<=list.length;i++){ 56 printf("%d\t",list.elem[i]); 57 } 58 printf("\n"); 59 60 } 61 62 int Partition(List &L,int low,int high) 63 { 64 L.elem[0]=L.elem[low]; 65 int pivokkey=L.elem[low]; 66 while(low<high){ 67 while(low<high&&L.elem[high]>=pivokkey) --high; 68 L.elem[low]=L.elem[high]; 69 while(low<high&&L.elem[low]<=pivokkey) ++low; 70 L.elem[high]=L.elem[low]; 71 } 72 L.elem[low]=L.elem[0]; 73 return low; 74 } 75 void QSort(List &L,int low,int high) 76 { 77 if(high>low) 78 { 79 int pivok=Partition(L,low,high); 80 QSort(L,low,pivok-1); 81 QSort(L,pivok+1,high); 82 } 83 } 84 void QuickSort(List &L) 85 { 86 QSort(L,1,L.length); 87 } 88 int main() 89 { 90 91 List list; 92 initList(list); 93 insert(list,49);insert(list,38);insert(list,65);insert(list,97);insert(list,76); 94 insert(list,13);insert(list,27);insert(list,49); 95 printList(list); 96 QuickSort(list); 97 printf("排序后\n"); 98 printList(list); 99 return 0;100 }
3.显示结果
4.快速排序性能
快速排序QuickSort,就平均时间而言,目前被认为是最好的一种内部排序方法。在所有同数量级O(nlogn)的排序算法中,其平均性能最好,但是初始序列按关键字有序或者基本有序时,快速排序将蜕变为冒泡法,其时间复杂度O(n^2)。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。