再寫排序

對于一個int數(shù)組为居,請編寫一個插入排序算法矾克,對數(shù)組元素排序教寂。給定一個int數(shù)組A及數(shù)組的大小n捏鱼,請返回排序后的數(shù)組。

測試樣例:
[1,2,3,5,2,3],6
[1,2,2,3,3,5]

****1.插入排序****

import java.util.*;

public class InsertionSort {
    public int[] insertionSort(int[] A, int n) {
        // write code here
        if(null==A||n<=0)
            return A;
        for(int i=1;i<n;i++){
            for(int j=i;j>0;--j){
                if(A[j]<A[j-1]){
                    int temp = A[j-1];
                    A[j-1] = A[j];
                    A[j] = temp;
                }
            }
        }
        return A;
    }
}

****2.歸并排序****

import java.util.*;

public class MergeSort {
    public int[] mergeSort(int[] A, int n) {
        // write code here
        if(null==A||n<=1)
            return A;
        int start = 0,end = n-1;
        int[] copy = new int[n];//歸并排序需要一個輔助數(shù)組
        merge(A,copy,start,end);
        return A;
    }
    private void merge(int[] A, int[] copy, int start, int end){
        if(start==end)
            return;
        int mid = (start+end)>>1;
        merge(A,copy,start,mid);
        merge(A,copy,mid+1,end);
        for(int i=start;i<=end;i++)//先讓輔助數(shù)組跟原數(shù)組一樣
            copy[i] = A[i];
        int id = start;
        int m = start;
        int n = mid+1;
        while(m<=mid&&n<=end){
            if(copy[m]<=copy[n]){
                A[id++] = copy[m++];
            }else{
                A[id++] = copy[n++];
            }
        }
        while(m<=mid)
            A[id++] = copy[m++];
        while(n<=end)
            A[id++] = copy[n++];
    }
}

****3.快速排序****

import java.util.*;

public class QuickSort {
    public int[] quickSort(int[] A, int n) {
        // write code here
        if(null==A||n<=1)
            return A;
        int start = 0,end=n-1;
        quick(A,start,end);
        return A;
    }
    private void quick(int[] A, int start, int end){
        if(start>=end)
            return;
        int key = A[start];//選擇一個劃分值
        int i=start,j;
        //如果此處元素小于劃分值酪耕,則把此元素和i+1處元素交換导梆,并將i加1,如大于或等于劃分值則繼續(xù)循環(huán)
        for(j=start+1;j<=end;j++){
            if(A[j]<key){
                int temp = A[j];
                A[j] = A[i+1];
                A[i+1] = temp;
                i++;
            }
        }
        A[start] = A[i];
        A[i] = key;
        quick(A,start,i-1);
        quick(A,i+1,end);
    }
}

****4.堆排序****

import java.util.*;

public class HeapSort {
    public int[] heapSort(int[] A, int n) {
        // write code here
        if(null==A||n<=1)
            return A;
        for(int i=0;i<n-1;i++){
            buildMaxHeap(A,n-1-i);
            swap(A,0,n-1-i);
        }
        return A;
    }
    private void buildMaxHeap(int[] A, int lastIndex){//建大根堆
       for(int i=(lastIndex-1)/2;i>=0;i--){//從lastIndex節(jié)點的父節(jié)點開始建堆
           int k = i;//記錄當(dāng)前節(jié)點
           while((2*k+1)<=lastIndex){//為每個節(jié)點建立大根堆,只要這個根節(jié)點還有子節(jié)點 
               int bigIndex = 2*k+1;//假設(shè)左節(jié)點的值最大
               if(bigIndex<lastIndex){//有右節(jié)點存在
                   //子節(jié)點中的最大值
                   if(A[bigIndex]<A[bigIndex+1])
                       bigIndex++;
               }
               //根節(jié)點跟子節(jié)點比較
               if(A[k]<A[bigIndex]){
                   swap(A,k,bigIndex);
                   k = bigIndex;
               }
               else
                   break;
           }
       } 
    }
    private void swap(int[] A, int i, int j){
        int temp = A[i];
        A[i] = A[j];
        A[j] = temp;
    }
}

****5.希爾排序****

import java.util.*;

public class ShellSort {
    public int[] shellSort(int[] A, int n) {
        // write code here
        if(null==A||n<=1)
            return A;
        int increment,i,j,temp;
        for(increment = n/2;increment>=1;increment/=2){//希爾排序的步長逐漸減小到1
            for(i=increment;i<n;i++){//分組進(jìn)行插入排序
                temp = A[i];
                for(j=i-increment;(j>=0)&&(A[j]>temp);j-=increment)
                    A[j+increment] = A[j];
                A[j+increment] = temp;//后面小于待插入元素,設(shè)定待插入元素位置
            }
        }
        return A;
    }
}

****6.計數(shù)排序****

import java.util.*;

public class CountingSort {
    public int[] countingSort(int[] A, int n) {
        // write code here
        if(null==A||n<=1)
            return A;
        int NUM = 999;
        int[] B = new int[NUM];
        for(int i=0;i<NUM;i++)
            B[i] = 0;//先讓數(shù)組B中的元素全部為0
        for(int i=0;i<n;i++)
            B[A[i]]++;
        int k = -1;
        for(int i=0; i<NUM;i++){
            int j = B[i];
            while(j>0){
                k++;
                A[k] = i;
                j--;
            }
        }
        return A;
    }
}

****7.基數(shù)排序****

import java.util.*;

public class RadixSort {
    public int[] radixSort(int[] A, int n) {
        // write code here
        if(null==A||n<=1)
            return A;
        radix(A,10,3,n);
        return A;
    }
    private void radix(int[] A, int radix, int d,int n){//傳入的d為3(考慮分解為個位十位百位)
        int[] temp = new int[n];//臨時數(shù)組
        int[] buckets = new int[radix];//radix為10,按10進(jìn)制拆分(10個桶)
        //循環(huán)中rate用于保存當(dāng)前計算的位,十位時rate=10
        for(int i=0,rate=1;i<d;i++){//
            Arrays.fill(buckets,0);//buckets數(shù)組中全部為0
            System.arraycopy(A,0,temp,0,n);//將A中元素復(fù)制進(jìn)臨時數(shù)組緩存
            for(int j=0;j<n;j++){
                //計算數(shù)據(jù)指定位上的子關(guān)鍵字
                int subKey = (temp[j]/rate)%radix;
                buckets[subKey]++;
            }
            for(int j=1;j<radix;j++){
                buckets[j] = buckets[j]+buckets[j-1];
            }
            //按子關(guān)鍵字對指定數(shù)據(jù)進(jìn)行排序
            for(int m=n-1;m>=0;m--){
                int subKey = (temp[m]/rate)%radix;
                A[--buckets[subKey]] = temp[m];
            }
            rate *= radix;
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市看尼,隨后出現(xiàn)的幾起案子递鹉,更是在濱河造成了極大的恐慌,老刑警劉巖藏斩,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件躏结,死亡現(xiàn)場離奇詭異,居然都是意外死亡狰域,警方通過查閱死者的電腦和手機媳拴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來北专,“玉大人禀挫,你說我怎么就攤上這事⊥赝牵” “怎么了语婴?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驶睦。 經(jīng)常有香客問我砰左,道長,這世上最難降的妖魔是什么场航? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任缠导,我火速辦了婚禮,結(jié)果婚禮上溉痢,老公的妹妹穿的比我還像新娘僻造。我一直安慰自己,他們只是感情好孩饼,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布髓削。 她就那樣靜靜地躺著,像睡著了一般镀娶。 火紅的嫁衣襯著肌膚如雪立膛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天梯码,我揣著相機與錄音宝泵,去河邊找鬼。 笑死轩娶,一個胖子當(dāng)著我的面吹牛儿奶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鳄抒,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼闯捎,長吁一口氣:“原來是場噩夢啊……” “哼搅窿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起隙券,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤男应,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后娱仔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沐飘,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年牲迫,在試婚紗的時候發(fā)現(xiàn)自己被綠了耐朴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡盹憎,死狀恐怖筛峭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情陪每,我是刑警寧澤影晓,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站檩禾,受9級特大地震影響挂签,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜盼产,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一饵婆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧戏售,春花似錦侨核、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至紧卒,卻和暖如春侥衬,著一層夾襖步出監(jiān)牢的瞬間诗祸,已是汗流浹背跑芳。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留直颅,地道東北人博个。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像功偿,于是被迫代替她去往敵國和親盆佣。 傳聞我的和親對象是個殘疾皇子往堡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序共耍,而外部排序是因排序的數(shù)據(jù)很大虑灰,一次不能容納全部...
    每天刷兩次牙閱讀 3,732評論 0 15
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,258評論 0 2
  • 總結(jié)一下常見的排序算法。 排序分內(nèi)排序和外排序痹兜。內(nèi)排序:指在排序期間數(shù)據(jù)對象全部存放在內(nèi)存的排序穆咐。外排序:指在排序...
    jiangliang閱讀 1,346評論 0 1
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序字旭,而外部排序是因排序的數(shù)據(jù)很大对湃,一次不能容納全部...
    蟻前閱讀 5,186評論 0 52
  • 昨天,跟每一個周三一樣遗淳,去當(dāng)一個輔導(dǎo)小朋友的青協(xié)活動的工作人員拍柒。我室友和一個師姐也是其中的志愿者,不知道發(fā)生了什么...
    liangliang梁閱讀 248評論 1 1