c++ 基數排序


基數排序

題目和我的前幾個排序一樣

AC代碼

#include <bits/stdc++.h>
using namespace std;
int ArrLength(int Arr[]) //測出int數組的長度 
{
    int i = 0; 
    while (Arr[i])
        i ++;
    return i;
}
    /**
     * 遞歸,找出數組最大的值
     *
     * @param arrays 數組
     * @param L      左邊界,第一個數
     * @param R      右邊界,數組的長度
     * @return
     */
int findMax(int arrays[],int L,int R)
{
	//如果該數組只有一個數,那么最大的就是該數組第一個值了
    if (L == R)
	return arrays[L];
    else
    {
		int a = arrays[L];
	    int b = findMax(arrays, L + 1, R);//找出整體的最大值
		if (a > b)
		    return a;
		else
		{
		    return b;
		}
    }
}
void radixSort(int arrays[])
{
    int max = findMax(arrays, 0,ArrLength(arrays) - 1);
    //需要遍歷的次數由數組最大值的位數來決定
    for (int i = 1; max / i > 0; i = i * 10)
    {
		int buckets[ArrLength(arrays)][10];
		//獲取每一位數字(個、十、百、千位...分配到桶子里)
		memset(buckets,0,sizeof(buckets));//【重點】一定要memset 一定要memset 否則會內存泄漏(Segmentation fault) 
		for (int j = 0; j < ArrLength(arrays); j++)
	    {
			int num = (arrays[j] / i) % 10;
			//將其放入桶子里
		    buckets[j][num] = arrays[j];
	    }
	    //回收桶子里的元素
		int k = 0;
		//有10個桶子
		for (int j = 0; j < 10; j++)
		{
			 //對每個桶子里的元素進行回收
		    for (int l = 0; l < ArrLength(arrays); l++)
		    {
		    	//如果桶子里面有元素就回收(數據初始化會為0)
				if (buckets[l][j] != 0)
				{
				    arrays[k++] = buckets[l][j];
				}
		    }
	  	}
    }
}
int main()
{
    int arrays[100] = {73,22,93,43,55,14,28,65,39,81};
    radixSort(arrays);
    for (int i = 0;i <= ArrLength(arrays) - 1 ;i ++)
		cout << arrays[i] << " ";
    return 0;
}

思路

假設原來有一串數值如下所示:
73, 22, 93, 43, 55, 14, 28, 65, 39, 81
首先根據個位數的數值,在走訪數值時將它們分配至編號0到9的桶子中:
0
1 81
2 22
3 73 93 43
4 14
5 55 65
6
7
8 28
9 39

第二步:
接下來將這些桶子中的數值重新串接起來,成為以下的數列:
81, 22, 73, 93, 43, 14, 55, 65, 28, 39
接着再進行一次分配,這次是根據十位數來分配:
0
1 14
2 22 28
3 39
4 43
5 55
6 65
7 73
8 81
9 93

第三步:
接下來將這些桶子中的數值重新串接起來,成為以下的數列:
14, 22, 28, 39, 43, 55, 65, 73, 81, 93
這時候整個數列已經排序完畢;如果排序的對象有三位數以上,則持續進行以上的動作直至最高位數為止。

總結

基數排序沒有關鍵字的比較,通過"分配"和"收集"過程來實現排序
排序過程中,要注意"分配"和"收集"的順序(重點)

概念

基數排序是一種借助於多關鍵字排序的思想對單關鍵字排序的方法,是通過"分配"和"收集"的過程來實現排序.

參考鏈接:
[https://v.youku.com/v_show/id_XMTYxNjYzNjYwNA==.html?spm=a2h0k.11417342.soresults.dtitle]

特殊說明

一定要用memset!!


免責聲明!

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



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