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;
}

 

 了解了思想之后可以拓展雙關鍵字快排。見博客。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM