c 基數排序

 
c 基數排序


#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <unistd.h>
#include <stdlib.h>
//計數排序,npRadix爲對應的關鍵字序列,nMax是關鍵字的範圍。npData是具體要
//排的數據,nLen是數據的範圍,這裏必須注意npIndex和npData對應的下標要一致
//也就是說npIndex[1] 所對應的值爲npData[1]
int RadixCountSort(int* npIndex, int nMax, int* npData, int nLen)
{
    //這裏就不用說了,計數的排序。不過這裏爲了是排序穩定
    //在標準的方法上做了小修改。

    int* pnCount  = (int*)malloc(sizeof(int)* nMax);        //保存計數的個數
int i = 0;
    for (i = 0; i < nMax; ++i)
    {
        pnCount[i] = 0;
    }
    for (i = 0; i < nLen; ++i)    //初始化計數個數
    {
        ++pnCount[npIndex[i]];
    }

    for (i = 1; i < 10; ++i)  //確定不大於該位置的個數。
    {
        pnCount[i] += pnCount[i - 1];
    }

    int * pnSort  = (int*)malloc(sizeof(int) * nLen);    //存放零時的排序結果。

    //注意:這裏i是從nLen-1到0的順序排序的,是爲了使排序穩定。
    for (i = nLen - 1; i >= 0; --i)
    {
        --pnCount[npIndex[i]];        
        pnSort[pnCount[npIndex[i]]] = npData[i];
    }

    for (i = 0; i < nLen; ++i)        //把排序結構輸入到返回的數據中。
    {
        npData[i] = pnSort[i];
    }
    free(pnSort);                        //記得釋放資源。
    free(pnCount);
    return 1;
}

//基數排序
int RadixSort(int* nPData, int nLen)
{
    //申請存放基數的空間
    int* nDataRadix    = (int*)malloc(sizeof(int) * nLen);

    int nRadixBase = 1;    //初始化倍數基數爲1
    int nIsOk = 0; //設置完成排序爲0

    //循環,知道排序完成
    while (!nIsOk)
    {
        nIsOk = 1;
        nRadixBase *= 10;
       int i = 0; 
        for (i = 0; i < nLen; ++i)
        {
            nDataRadix[i] = nPData[i] % nRadixBase;
            nDataRadix[i] /= nRadixBase / 10;
            if (nDataRadix[i] > 0)
            {
                nIsOk = 0;
            }
        }
        if (nIsOk)        //如果所有的基數都爲0,認爲排序完成,就是已經判斷到最高位了。
        {
            break;
        }
        RadixCountSort(nDataRadix, 10, nPData, nLen);
    }

    free(nDataRadix);

    return 1;
}

int main()
{
 int lens = 1000000;
    int a[1000000];
    int i = 0;
    for(i = 0; i < lens; i++ )
    {
        a[i] = rand();
    }
/*
    //測試基數排序。
    int nData[10] = {123,5264,9513,854,9639,1985,159,3654,8521,8888};
*/
struct timeval tv1, tv2;
    double sec = 0;
    gettimeofday(&tv1, 0);
    RadixSort(a, lens);
gettimeofday(&tv2, 0);
    sec = (double)(tv2.tv_sec - tv1.tv_sec) +  (double)(tv2.tv_usec - tv1.tv_usec) / 1000000;
    printf("time1: %f\n", sec);

    for (i = 0; i < 10; ++i)
    {
        printf("%d ", a[i]);
    }
    printf("\n");

    return 0;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章