终于涉及到一个小小的算法啦~~开心是无法表达哒~~~ 现在总结一下,加深印象
哈哈!!加油!! 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; }
时间: 2024-10-28 20:25:30