注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mr.Right

不顾一切的去想,于是我们有了梦想。脚踏实地的去做,于是梦想成了现实。

 
 
 

日志

 
 
关于我

人生一年又一年,只要每年都有所积累,有所成长,都有那么一次自己认为满意的花开时刻就好。即使一时不顺,也要敞开胸怀。生命的荣枯并不是简单的重复,一时的得失不是成败的尺度。花开不是荣耀,而是一个美丽的结束,花谢也不是耻辱,而是一个低调的开始。

网易考拉推荐

阿英讲快速排序 -- C语言实现  

2012-08-09 20:48:00|  分类: 编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
快速排序使用分治法(Divide and conquer)策略来把一个list分为两个sub-lists。
步骤为:
从数列中挑出一个元素,称为 "基准"(pivot),
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
 
 
#include <stdio.h>
#include <stdlib.h>
void quicksort(int a[],int first,int last) //first排序数组的开始下标, last为排序数组的结束下标

{
   if (first>=last)return ;
   int j ,i,key;
   i=first;j=last;key=a[i];
   while(i<j)  // 此循环的目的就是给key找合适的位置
     {
        while(i<j&&a[j]>key)j--;    /* 从右向左找第一个小于key的数 */
        if (i<j) a[i++]=a[j];
        while (i<j&&a[i]<key)i++; /* 从左向右找第一个大于key的数 */
        if (i<j) a[j--]=a[i];
     }
    a[i]=key;   // 将key放在这里, i 就是pivotIndex
    quicksort(a,first,i-1);
    quicksort(a,i+1,last);
 
}


int main()
{
    int i;
    int len;
    int array[] = {1200, 278, 85, 24, 18, 69, 58, 21, 175, 28, 1};
    len = sizeof( array ) / sizeof( *array );
    printf( "排序前数组序列:\n" );
    for ( i = 0;i < len;i++ )
    {
        printf( "%5d", array[i] );
    }
    quicksort( array, 0, len-1 ); 
    printf( "\n排序后数组序列:\n" );
    for ( i = 0;i < len;i++ )
    {
        printf( "%5d", array[i] );
    }
    getchar();
}

  评论这张
 
阅读(466)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016