如何利用C函數庫中的 qsort 來排序

 下載範例<qsort.cpp>

#include <stdio.h>

#include <stdlib.h>

#include<time.h>

 

int compare(const void *a, const void *b)//這函式是 qsort 所需的比較函式
{
      int c = *(int *)a;
      int d = *(int *)b;
      if(c < d) {return -1;}               //傳回 -1 代表 a < b
      else if (c == d) {return 0;}      //傳回   0 代表 a = b
      else return 1;                          //傳回  1 代表 a>b
}

/* 字串部分比較 可以利用下列部分

int compare( const void *a, const void *b)

{

return( strcmp((char *)a,(char *)b) );

}

*/

 

void main()

{

     int a[100],i;

     srand((unsigned) time(NULL));

     for(i=0;i<100;i++)
        a[i]=rand();       //亂數產生100個數字

     for(unsigned i = 0; i < 100; i++)
    {
         printf(" %d\t ", a[i]);     //印出排序前的內容
     }

     printf("\n");

    /*qsort 函數說明 ->>需要 #include<stdlib.h>

      void qsort(void* base, size_t n, size_t size, int (*cmp)(const void*, const void*)):陣列基礎的快速排序法函數,陣列是參數 base,n 是陣列大小,size 是每個元素的大小,最後的參數是指向函數的指標,這是比較元素大小的函數( 即上面 compare() 函數)

    */

   qsort((void *)a, 100, sizeof(a[0]), compare);

     for(unsigned i = 0; i < 100; i++)

     {

         printf(" %d\t", a[i]); //印出排序後的內容

     }

     system("PAUSE");

}

 

以下來自Delphi K Top討論區 brant所發表

給你一個 sample code ,比 float 用 strcmp 去比也許會容易讓人搞不清楚:
小數點以下19位,用 long double 一定夠了吧...


#include <iostream>
using namespace std;

int compare( const void *arg1, const void *arg2 )
{
	long double ret = *(long double*)(arg1)-*(long double*)(arg2);
	if (ret>0) return 1;
	if (ret<0) return -1;
	return 0;
}

void main()
{
	long double test[5];
	int i;

	test[0] = 0.257932167931;
	test[1] = 0.597136798769;
	test[2] = 0.166879313246;
	test[3] = 1.267498764654;
	test[4] = 0.649843143498;

	qsort(test,5,sizeof(long double),compare);

	for (i=0;i<5;i++) {
		cout << test[i] <<endl;
	}
}
//以下改成DEV C++可執行 by hlf
#include <iostream.h>
#include <stdlib.h>
using namespace std;
int compare( const void *arg1, const void *arg2 )
{
        long double ret = *(long double*)(arg1)-*(long double*)(arg2);
        if (ret>0) return 1;
        if (ret<0) return -1;
        return 0;
}
void main()
{
        long double test[5];
        int i;
        test[0] = 0.257932167931;
        test[1] = 0.597136798769;
        test[2] = 0.166879313246;
        test[3] = 1.267498764654;
        test[4] = 0.649843143498;
        qsort(test,5,sizeof(long double),compare);
        for (i=0;i<5;i++) {
                cout << test[i] <<endl;
        }
     system("PAUSE");
}
 

 其他可以參閱The Counting Sort Algorithm