資料結構 排序演算法之計數排序與基數排序

2021-08-19 10:19:39 字數 2120 閱讀 2040

一、計數排序

很好理解,就是對應每個數我們統計每個數字出現的次數,然後用乙個直接定址的雜湊表來存放資料,在通過遍歷這個雜湊表,進而就可以排好序了

如下所示:

**實現如下所示:

void countsort(int *array, int size)

//開闢輔助空間

int range = maxdata - mindata + 1;

int *pcount = new

int[range];

memset(pcount, 0, range*sizeof(int));

//統計每個字元出現的次數

for (int i = 0; i < size; ++i)

//**已經統計好的字元

int index = 0;

for (int i = 0; i < range; ++i)

delete pcount;

}

二、基數排序

(一)低關鍵碼排序

從個位到最高位(例如:最大的數為12345,那麼最高位便為萬位),每次由高從低到高進行排序。排完最高為之後,整個序列就變得有序了

如圖所示:

**如下所示:

//獲取最大數的位元位的位數

int getbitcount(int *array, int size)

}return count;

}//基數排序-----非比較排序2----低關鍵碼排序

void radixsort_lsd(int*array, int size)

;//存放計數的陣列

//統計每個桶中元素的個數

for (int i = 0; i < size; ++i)

else

}//計算每個桶的起始位址

int startaddr[10] = ;

for (int i = 1; i < 10; ++i)//表示10個桶

//將對應元素放置到對應的桶中

for (int i = 0; i < size; ++i)

else

}//**元素

memcpy(array, bucket, size*sizeof(array[0]));

//下面再來排百位等....

radix *= 10;}}

(二)搞關鍵碼排序

**如下所示:

void _radixsort_msd(int*array, int left, int right, int bit, int* bucket)

; for (int i = left; i < right; ++i)

bucketcount[array[i] / radix % 10]++;

// 統計每個桶的起始位址

int startaddr[10] = ;

for (int i = 1; i < 10; ++i)

startaddr[i] = startaddr[i - 1] + bucketcount[i - 1];

// 將各元素放置到對應的桶中

只有不停的奔跑,才能不停留在原地!!!

資料結構與演算法之計數排序

計數排序的基本思想 在乙個陣列中對每個元素按大小進行排名次,乙個元素的名次是陣列中比他小的元素的個數加上左邊出現的與之相等的元素的個數 備註 這裡名次越高說明元素越大 例如陣列a 5,4,2,5,8,9 新建乙個相同大小的陣列用於儲存陣列元素的名次,得到名次陣列 r 2,1,0,3,4,5 名次計算...

資料結構之計數排序

計數排序是一種比較快速的排序方法,相對於氣泡排序 快速排序 堆排序 雞尾酒排序等,計數排序是一種不需要進行元素之間對比的排序演算法,但是該演算法也有一定的侷限性。演算法思路 需要使用乙個計數陣列,將待排序陣列中的每個元素遍歷一遍,將每個元素出現的個數放到計數陣列中,元素的值是多少就在計數陣列相應的下...

排序演算法之計數排序

今在學習中,遇到計數排序演算法,雖然其對待排序的序列要求嚴格,但對於符合條件的序列來說,其時間複雜度很小。故列於此,僅為學習記憶。參考資料 對於僅由大寫字母 或小寫字母 構成的無序序列,可採用下面演算法進行排序。該演算法不在序列的每個元素間進行比較,而是使用了乙個額外的help整型字串來記錄每個元素...