Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2095173
  • 博文数量: 249
  • 博客积分: 1305
  • 博客等级: 军士长
  • 技术积分: 4733
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-17 10:37
个人简介

不懂的东西还有很多,随着不断的学习,不懂的东西更多,无法消灭更多不懂的东西,那就不断的充实自己吧。 欢迎关注微信公众号:菜鸟的机器学习

文章分类

全部博文(249)

文章存档

2015年(1)

2014年(4)

2013年(208)

2012年(35)

2011年(1)

分类: C/C++

2012-02-16 15:49:09

一、快速排序算法的思想
  
    快速排序是基于分而治之的思想处理的。
    1、分解
    array[f...l]被划分为两个子数组array[f...q-1]和array[q...r],使得array[f...q-1]<=array[q]       <=array[q...r]。
    2、解决
    通过递归调用快速排序,对两个子数组进行排序。
    3、合并

二、快速排序算法的描述
       
  1. QuickSort(int array[],int first,int last)
  2. {
  3.     if(first<last)
  4.     {
  5.        k=partition(array,first,last);
  6.        QuickSort(array,first,k-1);
  7.        QuickSort(array,k+1,last);
  8.     }
  9. }
   数组的划分:快速排序的关键是partition的过程,即对数组的重新排序:
   
  1. partition(int array[],int first,int last)
  2. {
  3.      key <- array[last];
  4.      i <- first-1;
  5.      for j <- first to last-1
  6.      {
  7.            if(array[j]<=key)
  8.            {
  9.                 i++; 
  10.                 swap(&array[i],&array[j]);
  11.            }
  12.      }
  13.      swap(&array[i+1],&array[last]);
  14.      return i+1;
  15. }
   举个例子,如下为第一趟排序:
   第一趟(4步):
   a:3   8   7   1   2   5   6   4   //以最后一个元素,array[last]为key

   b:3   1   7   8   2   5   6   4

   c:3   1   2   8   7   5   6   4

   d:3   1   2   4   7   5   6   8    //最后,swap(&array[i+1],&data[last])

三、C代码实现

   
  1. #include "stdio.h"
  2. /*
  3. * 函数:swap(int *a,int *b)
  4. * 功能:进行两个数的交换
  5. */
  6. void swap(int *a,int *b)
  7. {
  8.     int temp;
  9.     temp=*a;
  10.     *a=*b;
  11.     *b=temp;
  12. }
  13. /*
  14. * 函数:partition(int array[],int ,int)
  15. * 功能:分而治之,即对数组data进行重新排序
  16. * 返回值:基准位置
  17. */
  18. int partition(int array[],int first,int last)
  19. {
  20.     int key=array[last];//以最后一个元素为key
  21.     int i=first-1;
  22.     int j;
  23.     for(j=first;j<last;j++)
  24.     {
  25.         if(array[j]<=key)
  26.         {
  27.             i++;
  28.             swap(&array[i],&array[j]);
  29.         }
  30.     }
  31.     swap(&array[i+1],&array[j]);//不能改为swap(&array[i+1],&key)
  32.     return i+1;
  33. }
  34. /*
  35. * 函数:QuickSort(int array[],int f,int h)
  36. * 功能:进行快速排序—递归算法
  37. */
  38. void QuickSort(int array[], int f, int h)
  39. {
  40.     if (f<h)
  41.     {
  42.         int k = partition(array, f, h);
  43.         QuickSort(array, f, k-1);
  44.         QuickSort(array, k+1, h);
  45.     }
  46. }

  47. int main(int argc,char *argv[])
  48. {
  49.     int array[]={3,8,7,1,2,5,6,4};
  50.     QuickSort(array,0,7);
  51.     for(int i=0;i<8;i++)
  52.     {
  53.         printf("%d ",array[i]);
  54.     }
  55.     printf("\n");
  56.     return 0;
  57. }
四、快速排序算法的时间复杂度
    
   快速排序每次将待排序数组分为两个部分,在理想状况下,每一次都将待排序数组划分成等长两个部 分,则需要logn次划分。
   而在最坏情况下,即数组已经有序或大致有序的情况下,每次划分只能减少一个元素,快速排序将不幸退化为冒泡排序,所以快速排序时间复杂度下界为O(nlogn),最坏情况为O(n^2)。在实际应用中,快速排序的平均时间复杂度为O(nlogn)。
    
阅读(1519) | 评论(0) | 转发(0) |
0

上一篇:Makefile(8)

下一篇:排序算法——冒泡排序

给主人留下些什么吧!~~