首页 > 代码库 > 快速排序 (总结)

快速排序 (总结)

 

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

哈哈!!加油!! 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;}

 

 

  

快速排序 (总结)