Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3892220
  • 博文数量: 146
  • 博客积分: 3918
  • 博客等级: 少校
  • 技术积分: 8585
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-17 13:52
个人简介

个人微薄: weibo.com/manuscola

文章分类

全部博文(146)

文章存档

2016年(3)

2015年(2)

2014年(5)

2013年(42)

2012年(31)

2011年(58)

2010年(5)

分类: C/C++

2011-08-19 22:01:27

    所有的排序算法中,快速排序一定要会写,因为这个最实用。完全可以用在工程实践之中。

    下面的实现没有采用随机化的策略,每次partition,都把最右边的元素作为主元或者衡量的坐标,把比主元小的放在左边,比主元大的放在右边,主元的位置作为interval返回。

    本文提供的算法存在一定的弊端,就是选的主元有可能不能将数组分成均等的两份,极端情况下,比如输入是逆序的情况下,选的主元没有起到任何分而治之的目的,导致算法复杂度变为O(N^2)。

    解决的办法有:

    1 随机化策略,partition不是选择最右边的元素,而是在【left,right】之间随机选择一个元素,作为主元。(选中后,和最右边的元素交换即可。其他不变)。这种方法也有缺点,就是每次选择主元,都需要个随机化得函数,代价稍微有点高。

    2 三者取中的办法,将最左端 最右端,和中间三个元素进行比较,选择三者中间那个元素作为主元。代价较低。能起到不错的效果。当然这种方法在某些情景下也可能退化。



  1. #include<stdio.h>
  2. #include<time.h>
  3. #include<stdlib.h>

  4. void swap(int *a ,int *b)
  5. {
  6.     int t = *a;
  7.     *a = *b;
  8.     *b = t;
  9. }


  10. int partition(int array[],int l,int r)
  11. {
  12.     int pivot = array[r];
  13.     int curpos = l;
  14.     int j ;

  15.     for( j = l;j<r;j++)
  16.     {
  17.         if(array[j] < pivot)
  18.         {
  19.             swap(&array[j],&array[curpos]);
  20.             curpos++;
  21.         }
  22.     }

  23.     swap(&array[r],&array[curpos]);
  24.     return curpos;
  25.     
  26.     
  27. }

  28. void quicksort(int array[],int l,int r)
  29. {
  30.     int interval;
  31.     if(l < r)
  32.     {
  33.         interval = partition(array,l,r);
  34.         quicksort(array,l,interval-1);
  35.         quicksort(array,interval+1,r);
  36.     }
  37.         
  38. }


  39. int test_quicksort()
  40. {
  41.     int number = 12;
  42.     int *array = malloc(number*sizeof(int));
  43.     if(array == NULL)
  44.     {
  45.         printf("malloc failed\n");
  46.         return -1;
  47.     }
  48.     int i;

  49.     printf("----------------------------------------before quick sort--------------\n");
  50.     srand(time(NULL));
  51.     for(i = 0;i<number;i++)
  52.     {
  53.         array[i] = rand()%1000;
  54.         printf("\tarray[%d] = %d\n",i,array[i]);
  55.     }

  56.     printf("----------------------------------------after quick sort-----------------\n");
  57.     
  58.     quicksort(array,0,number-1);
  59.     for(i = 0;i<number;i++)
  60.     {
  61.         printf("\tarray[%d] = %d\n",i,array[i]);
  62.     }
  63.     return 0;
  64. }
  65. int main()
  66. {
  67.     test_quicksort();
  68. }


阅读(7995) | 评论(0) | 转发(4) |
给主人留下些什么吧!~~