C语言快排

C语言使用快排的方式有两种,1、直接用库函数stdlib.h里的qsort函数 2、自己编写快排代码(第一种方便,第二种较为自由)

qsort 的函数原型是:
void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
它的参数为:

1 待排序数组首地址
2 数组中待排序元素数量
3 各元素的占用空间大小
4 指向函数的指针,用于确定排序的顺序

下面附上样例代码:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 int comp(const void*a,const void*b)
 4 {
 5 return *(int*)a-*(int*)b;
 6 }
 7 int main()
 8 {
 9     int *array;
10     int n;
11     scanf("%d",&n);
12     array=(int*)malloc(n*sizeof(int));
13     int i=0;
14     for(;i<n;i++)
15     {
16         scanf("%d",(array+i));
17     }
18     qsort(array,n,sizeof(int),comp);
19     for(i=0;i<n;i++)
20     {
21         printf("%d\t",array[i]);
22     }
23     free(array);
24     array=NULL; 
25     return 0;
26 }

另外自己编一个快排代码也是很方便的,对于初学者学会快排代码也是很有必要的。

下面说一下快排的基本思想。快排是冒泡的改进版,基本思想是选中要排序序列中的一个数,然后让它左边的数都比它小,右边的数都比它大(如果要降序的话就反之),如此递归即可。下面附上代码:

#include<stdio.h>

void qsort(int *a,int l,int r)
{
    int i=l;
    int j=r;
    int mid=a[(l+r)/2];
    int temp;
    while (i<j)
    {
        while (a[i]<mid) i++;
        while (a[j]>mid) j--;
        if (i<=j)
        {
            temp=a[i];
            a[i]=a[j];
            a[j]=temp;
            i++;
            j--;
        }
    }
    if (l<j) qsort(a,l,j);
    if (i<r) qsort(a,i,r);
}

int main()
{
    int n;
    scanf("%d",&n);
    int a[11]={};
    int i;
    for (i=1;i<=n;i++) {
        scanf("%d",&a[i]);
    }
    qsort(a,1,n);
    for (i=1;i<=n;i++) {
        printf("%d |",a[i]);
    }
    return 0;
}

 

 了解了思想之后可以拓展双关键字快排。见博客。

posted @ 2015-08-22 13:02  lvmememe  阅读(4920)  评论(0编辑  收藏  举报