1. 程式人生 > 實用技巧 >【轉】Python實現將多行格式化的字串進行壓縮

【轉】Python實現將多行格式化的字串進行壓縮

基數排序

基本概述

基數排序是一種非比較型整數排序演算法,其原理是將整數按位數切割成不同的數字,然後按每個位數分別比較。由於整數也可以表達字串(比如名字或日期)和特定格式的浮點數,所以基數排序也不是隻能使用於整數。

排序思路

基數排序是有兩種選擇,一種是高位優先法(MSD)(Most Significant Digit first),一種是低位優先法(LSD)(Least Significant Digit first),後者是先按個位數大小進行排序,再依次向高位排序,我們這裡採用後者。

java程式碼

public void radixSort(int[] target){
    //建立快取陣列,用於暫存每趟排序後的陣列
    int[] buf = new int[target.length];
    //用於迴圈進位,這裡用long是為了防止陣列中的數字位數過多,導致越界問題
    long exp = 1;
    int max = Arrays.stream(target).max().getAsInt(); //獲取陣列中最大值
    while(exp<=max){
        //用於統計每一輪該位數上數值為0-9的元素的個數
        int[] tmp = new int[10];
        for(int i=0;i<target.length;i++){
            tmp[(target[i] / (int)exp) % 10]++;
        }
        //為了定位每輪排序之後各元素在陣列中的位置範圍
        for(int i=1;i<10;i++){
            tmp[i] += tmp[i-1];
        }
        //暫存每趟排序後的陣列
        for(int i=buf.length-1;i>=0;i--){
            int x = (target[i] / (int)exp) % 10;
            buf[tmp[x]-1] = target[i];
            tmp[x]--;
        }
        System.arraycopy(buf,0,target,0,target.length);
        exp *= 10;
    }

複雜度分析

· 時間複雜度:O(r*N),其中r是陣列中最大數字的位數,N為陣列的長度,由於r為一個常量,故歸為O(N)。
· 空間複雜度:O(N),其中N為陣列的長度。