快速排序

来源:互联网 发布:360保险箱恢复数据 编辑:程序博客网 时间:2024/05/16 08:42

        快速排序也是一种比较快的排序算法,排序算法的好坏主要是根据排序算法的划分的。而且和输入的序列有关系。最好情况下的排序情况是Nlog(N)。当然最坏的情况下的时间复杂度就是N*N了。这个算法的好坏也就主要在划分元素的选取上了。其思想就是找一个元素,然后把所有元素和这个元素比较,比它小的放到一边,比它大的放到一边。然后继续递归调用,待排序的只有一个元素的时候也是排序成功的时候了。

       排序算法的选取是跟着算法导论上的,一个数组划分为三部分,选取最后一个元素作为划分比较的目标。比这个元素小的,接着是笔者个大的元素队列,剩下的就是没有比较的队列了,遇到比这个元素小的元素的时候就和笔者个元素大的队列中第一个元素进行交换位置,这样还能够维护最小的元素连在一起,最大的元素连在一起。直到最后一个元素前。然后继续交换进行。这样元素划分就完成了。接下来的就剩下继续递归调用划分了

#include<stdio.h>#include<stdlib.h>#include<string.h>#define N 100//对元素进行交换的函数void swap(int *a,int *b){    int t;    t = *a;    *a = *b;    *b = t;}//划分的函数,返回的是划分的为止int position(int *s,int begin,int end){    int i,j;    int pos;    pos = s[end];    i=begin-1;    for(j=begin;j<=end-1;j++){if(s[j]<=pos){  i++;  swap(&s[i],&s[j]);}    }    swap(&s[i+1],&s[end]);    return i+1;}//排序函数void qulick_sort(int *s,int begin,int end){    int q;    if(begin<end){//也就是这里,一不小心写成while找了一个晚上q=position(s,begin,end);qulick_sort(s,begin,q-1);qulick_sort(s,q+1,end);    }}//数组输出函数void print(int *s,int n){    int i;    for(i=0;i<n;i++)printf("%-3d",s[i]);    putchar('\n');}//自己写的主函数,进行测试int main(int argc,char *argv[]){    int n,i;    int s[N];    scanf("%d",&n);    for(i=0;i<n;i++)scanf("%d",&s[i]);    print(s,n);    qulick_sort(s,0,n-1);    print(s,n);    return 0;}


最好还是自己模拟一下,这样理解也比较清楚

原创粉丝点击