码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构之快速排序

时间:2014-08-01 04:43:11      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   数据   for   2014   

 

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.显示结果

bubuko.com,布布扣

4.快速排序性能

     快速排序QuickSort,就平均时间而言,目前被认为是最好的一种内部排序方法。在所有同数量级O(nlogn)的排序算法中,其平均性能最好,但是初始序列按关键字有序或者基本有序时,快速排序将蜕变为冒泡法,其时间复杂度O(n^2)。

数据结构之快速排序,布布扣,bubuko.com

数据结构之快速排序

标签:style   blog   http   color   io   数据   for   2014   

原文地址:http://www.cnblogs.com/forsta/p/3883832.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!