美文网首页
基数排序(OC、swift实现双语实现)

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

作者: 阿凡提说AI | 来源:发表于2018-01-19 15:42 被阅读18次

    一、算法描述

    基数排序是另外一种比较有特色的排序方式,它是怎么排序的呢?我们可以按照下面的一组数字做出说明: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; //复位
            }
            
        }
        
    }
    

    相关文章

      网友评论

          本文标题:基数排序(OC、swift实现双语实现)

          本文链接:https://www.haomeiwen.com/subject/csoooxtx.html