基数排序(OC、swift实现双语实现)

2018-01-19  本文已影响18人  阿凡提说AI

一、算法描述

基数排序是另外一种比较有特色的排序方式,它是怎么排序的呢?我们可以按照下面的一组数字做出说明:12、 104、 13、 7、 9
(1)按个位数排序是12、13、104、7、9
(2)再根据十位排序104、7、9、12、13
(3)再根据百位排序7、9、12、13、104
这里注意,如果在某一位的数字相同,那么排序结果要根据上一轮的数组确定,举个例子来说:07和09在十分位都是0,但是上一轮排序的时候09是排在07后面的;同样举一个例子,12和13在十分位都是1,但是由于上一轮12是排在13前面,所以在十分位排序的时候,12也要排在13前面。

所以,一般来说,基数排序的算法应该是这样的?
(1)判断数据在个位的大小,排列数据;
(2)根据(1)的结果,判断数据在十分位的大小,排列数据。如果数据在这个位置的余数相同,那么数据之间的顺序根据上一轮的排列顺序确定;
(3)依次类推,继续判断数据在百分位、千分位......上面的数据重新排序,直到所有的数据在某一分位上数据都为0。

算法分析

二、算法分析

平均时间复杂度:O(dn)(d即表示整形的最高位数)
空间复杂度:O(10n) (10表示0~9,用于存储临时的序列)
稳定性:稳定

三、算法实现

swift:

/********************************************************
     *函数名称:GetNumInPos
     *参数说明:num 一个整形数据
     *          pos 表示要获得的整形的第pos位数据
     *说明:    找到num的从低到高的第pos位的数据
     *********************************************************/
    func GetNumInPos(num:Int,pos:Int)->Int{
        var temp = 1
        for _ in  0..<pos-1{
            temp *= 10
        }
        return (num/temp)%10
    }
    
    /********************************************************
     *函数名称:RadixSort
     *参数说明:pDataArray 无序数组;
     *        iDataNum为无序数据个数
     *说明:    基数排序
     *********************************************************/
    func RadixSort(pDataArray:inout [Int], iDataNum:Int){
        var radixArrays = [[Int]]()
        for _ in 0..<10 {
            radixArrays.append([Int](repeating: 0, count: iDataNum+1))
        }
        let KEYNUM_31 = 10  //关键字个数,这里为32位整形位数
        for pos in 1...KEYNUM_31 { //从各位开始到31位
            for i in 0..<iDataNum {//分配过程
                let num = GetNumInPos(num: pDataArray[i], pos: pos)
                radixArrays[num][0] = radixArrays[num][0]+1
                let index = radixArrays[num][0]
                radixArrays[num][index] = pDataArray[i]
            }
            var j = 0
            for m in 0..<10 {  //收集
                
                if radixArrays[m][0] != 0{
                    for k in 1...radixArrays[m][0] {
                        pDataArray[j] = radixArrays[m][k]
                        j = j + 1
                        
                    }
                    radixArrays[m][0] = 0 //复位
                }
                
                
            }
        }
    }

OC:

- (int)GetNumInPos:(int)num pos:(int)pos{
    int temp = 1;
    for (int i=0; i<pos-1; i++) {
        temp *= 10;
    }
    return (num/temp)%10;
}
- (void)RadixSort:(NSMutableArray *) pDataArray iDataNum:(int)iDataNum{
    NSMutableArray *radixArrays = [NSMutableArray array];
    for (int i=0; i<10; i++) {
        NSMutableArray *arr = [NSMutableArray array];
        for (int i=0; i<iDataNum; i++) {
            [arr addObject:@0];
        }
        [radixArrays addObject:arr];
    }
    
    int KEYNUM_31 = 10; //关键字个数,这里为32位整形位数
    for (int pos =1; pos<=KEYNUM_31; pos++) {
        for (int i=0; i<iDataNum; i++) {
            int num = [self GetNumInPos:[pDataArray[i] intValue] pos:pos];
            int num2 = [radixArrays[num][0] intValue]+1;
            radixArrays[num][0] = @(num2);
            radixArrays[num][num2] = pDataArray[i];
        }
        
        for (int i=0,j=0; i<10; i++) {
            for (int k=1; k<=[radixArrays[i][0] intValue]; k++) {
                pDataArray[j]=radixArrays[i][k];
                j=j+1;
            }
            radixArrays[i][0] = @0; //复位
        }
        
    }
    
}
上一篇下一篇

猜你喜欢

热点阅读