码迷,mamicode.com
首页 > 编程语言 > 详细

快速排序 (总结)

时间:2014-11-03 22:13:32      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   for   sp   div   问题   log   

 

终于涉及到一个小小的算法啦~~开心是无法表达哒~~~ 现在总结一下,加深印象

哈哈!!加油!! I am a ACMer.!!! 哈哈!!

-------------------------------------------------------

排序是一个经典的问题,基本上学习C以来就学过排序了,比如冒泡排序.

但是,如果遇到很多数,显然快排的速度优势是最明显的,同时也是效率最高的!很多时候用快排既省时又省力.更好的是,快排写成模版,基本想用基本可以调用.

--------

对于一系列数,如 4 1 7 2 5 8 3 6 9

这九个数,如果用快排的思想是,先选一个标尺,用来装挖坑. 比如,现在拿4为标尺,(当然拿中间数也是可以的),然后逐个判定,(这里以升序为准),遇到比4小的数,

就排在4的左边,大的自然都到右边,经过一轮,这个数列就会变成下面这样:

3 1 2  4 5 7 6 9;

为什么会这样呢,可以先假定i=1 ,j=9 就是数列的开始和结束;先把第一个数赋值出来,(因为要挖坑,所以先要存下第一个数) 然后从第j个数开始比较,如果遇到比

第一个数小的,(如3) 就把3放到第一数去,然后 原来的3那个位置就是一个新的坑,这时候就从i++开始判定,从左往右,找比4大的数,遇到就移到原来3的位置来,(这里是7)

然后7就是一个新的位置,然后又从8位置开始判定,直到i==j;则一轮结束.

然后采用分治法.

左边就是从1到i-1 右边就是从i+1到9;

然后不断的迭代下去,最后即可排序.

由于文章是自我总结性文章,有许多不足之处请谅解,很开心能和大家一起学习,进步!

代码如下:(参考习题 杭电OJ 1040)

#include <stdio.h>

void quick_sort(int a[],int l,int r)
{
    if(l<r)
    {   int x;
        int i=l, j=r ; x= a[l];
        while(i<j)
        {
            while(i<j&&a[j]>=x)
            j--;
            if(i<j)
            a[i++]=a[j];
            
            while(i<j&&a[i]<x)
            i++;
            if(i<j)
            a[j--]=a[i];
        }
        a[i]=x;
        quick_sort(a,l,i-1);
        quick_sort(a,i+1,r);
    }
}



int main()
{
    int n,m,i,j,k,s,t;
    int a[1500];
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&m);
        for(k=1;k<=m;k++)
        scanf("%d",&a[k]);
        quick_sort(a,1,m);
        for(i=1;i<m;i++)
        printf("%d ",a[i]);
        printf("%d\n",a[i]);
    }
    
    return 0;
}

 

 

  

快速排序 (总结)

标签:style   blog   io   color   for   sp   div   问题   log   

原文地址:http://www.cnblogs.com/ikids/p/4072238.html

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