91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

線性時間排序--計數和基數排序

發布時間:2020-07-12 01:50:05 來源:網絡 閱讀:430 作者:匯天下豪杰 欄目:編程語言

 1、計數排序

  (1)、算法思想

  是一組在特定范圍內的整數,在線性時間內排序,比nlog(n)更快的排序算法;

  較小范圍內是比較好的排序算法,如果很大是很差的排序算法;

  可以解決重復元素的出現的排序算法;

  (2)、代碼實現

#include<stdio.h>

void countSort(int *a, int count);
void showArray(int *a, int count);

void showArray(int *a, int count){
    int i;

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

void countSort(int *a, int count){
    int b[10] = {0};
    int *c;
    int i;

    c = (int *)malloc(sizeof(int) * count);
    for(i = 0; i < count; i++){
        b[a[i]]++;
    }
    for(i = 1; i < 10; i++){
        b[i] += b[i-1];
    }

    for(i = count-1; i >= 0; i--){
        c[b[a[i]]-1] = a[i];
        b[a[i]]--;
    }

    for(i = 0; i < count; i++){
        a[i] = c[i];
    }

    free(c);

}
void main(void){
    int a[] = {2, 4, 7, 2, 1, 0, 9};
    int count = sizeof(a)/sizeof(int);

    countSort(a, count);
    showArray(a, count);
}

  (3)、結果截圖

線性時間排序--計數和基數排序

  (4)、算法分析:

  計數排序優點:穩定性(一個穩定性算法保證了相等元素的順序);

  時間復雜度:O(n);


2、基數排序

  (1)、算法思想

  i、從最后一位(低位-->高位)開始排序,并且的是穩定的排序算法(輔助算法:計數排序),整體思想:按位排序;

  ii、在進行基數排序時,從個位--->十位--->百位......每取一位時,分別進行計數排序,傳的參數:位、要排序的總數、新的結果、輔助空間(開辟10個元素的空間)、原先數組;利用位和輔助空間,將原先數組的值放入新的結果空間中即可;(位的順序與原先結果的順序保持一致)!!!

  iii、基數排序只要知道最大數是幾位,進行幾次排序即可;

  (2)、代碼實現

#include<stdio.h>
#include<malloc.h>

void radixSort(int *a, int count);
void countSort(int *bitNumber, int count, int *newA, int *c, int *a);
void showArray(int *a, int count);

void showArray(int *a, int count){
    int i;

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

void countSort(int *bitNumber, int count, int *newA, int *c, int *a){
    int i;

    //從個位-->十位-->百位,每一次調用這個函數,輔助空間都必須初始化為0;
    for(i = 0; i < 10; i++){
        c[i] = 0;
    }

    for(i = 0; i < count; i++){
        c[bitNumber[i]]++;
    }

    for(i = 1; i < 10; i++){
        c[i] += c[i-1];
    }

    for(i = count-1; i >= 0; i--){
        newA[c[bitNumber[i]]-1] = a[i];  //a[i]與原先所取的位順序一致
        c[bitNumber[i]]--;
    }
}

void radixSort(int *a, int count){
    int *bitNumber;
    int *newA;
    int c[10] = {0};
    int i;

    //個位進行排序
    bitNumber = (int *)malloc(sizeof(int) * count);
    newA = (int *)malloc(sizeof(int) * count);
    for(i = 0; i < count; i++){
        bitNumber[i] = a[i]%10;
    }
    countSort(bitNumber, count, newA, c, a);  //bitNumber:代表要排的數字;newA:代表最終排行的新空間
                                      // c:代表輔助空間 a:代表原先數字
    for(i = 0; i < count; i++){
        a[i] = newA[i];
    }

    //十位進行排序
    for(i = 0; i < count; i++){
        bitNumber[i] = a[i]/10%10;
    }
    countSort(bitNumber, count, newA, c, a);                      
    for(i = 0; i < count; i++){
        a[i] = newA[i];
    }

    //百位排序
    for(i = 0; i < count; i++){
        bitNumber[i] = a[i]/100%10;
    }
    countSort(bitNumber, count, newA, c, a);  
                                     
    for(i = 0; i < count; i++){
        a[i] = newA[i];
    }
    //千位排序
    for(i = 0; i < count; i++){
        bitNumber[i] = a[i]/1000%10;
    }
    countSort(bitNumber, count, newA, c, a);  
                                     
    for(i = 0; i < count; i++){
        a[i] = newA[i];
    }

}

void main(void){
    int a[] = {23, 1000, 90, 34, 2, 6, 3, 444, 555, 666, 777, 888, 999, 111, 222};
    int count = sizeof(a)/sizeof(int);
    radixSort(a, count);
    showArray(a, count);
}

  (3)、運行結果

線性時間排序--計數和基數排序

  (4)、算法分析

  時間復雜度:O(n);




向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

邮箱| 东方市| 兴安盟| 铜梁县| 陇川县| 勐海县| 工布江达县| 奈曼旗| 富源县| 仙居县| 隆德县| 隆回县| 和林格尔县| 孝义市| 德庆县| 新和县| 高邑县| 密山市| 武汉市| 乐业县| 乃东县| 壤塘县| 城口县| 米林县| 汉中市| 廉江市| 枝江市| 海安县| 集安市| 中宁县| 信宜市| 绍兴市| 乌恰县| 宁乡县| 灵石县| 页游| 老河口市| 汾西县| 遂溪县| 英吉沙县| 林州市|