排序

八大排序算法

一儒恋、歸并排序

遞歸及非遞歸的JAVA實(shí)現(xiàn)

public static void MergeSort(int[] arr, int low, int high)
{
    //使用遞歸的方式進(jìn)行歸并排序弊予,所需要的空間復(fù)雜度是O(N+logN)
    int mid = (low + high)/2;
    if(low < high)
    {
        //遞歸地對(duì)左右兩邊進(jìn)行排序
        MergeSort(arr, low, mid);
        MergeSort(arr, mid+1, high);
        //合并
        merge(arr, low, mid, high);
    }
}

//merge函數(shù)實(shí)際上是將兩個(gè)有序數(shù)組合并成一個(gè)有序數(shù)組
//因?yàn)閿?shù)組有序嚷硫,合并很簡(jiǎn)單宣蠕,只要維護(hù)幾個(gè)指針就可以了
private static void merge(int[] arr, int low, int mid, int high)
{
    //temp數(shù)組用于暫存合并的結(jié)果
    int[] temp = new int[high - low + 1];
    //左半邊的指針
    int i = low;
    //右半邊的指針
    int j = mid+1;
    //合并后數(shù)組的指針
    int k = 0;
    
    //將記錄由小到大地放進(jìn)temp數(shù)組
    for(; i <= mid && j <= high; k++)
    {
        if(arr[i] < arr[j])
            temp[k] = arr[i++];
        else
            temp[k] = arr[j++];
    }
    
    //接下來兩個(gè)while循環(huán)是為了將剩余的(比另一邊多出來的個(gè)數(shù))放到temp數(shù)組中
    while(i <= mid)
        temp[k++] = arr[i++];
    
    while(j <= high)
        temp[k++] = arr[j++];
    
    //將temp數(shù)組中的元素寫入到待排數(shù)組中
    for(int l = 0; l < temp.length; l++)
        arr[low + l] = temp[l];
}

二搁胆、快速排序

快排算法JAVA實(shí)現(xiàn)

/**
 * 快速排序
 * 基本思想:
 * 1.在待排序的元素任取一個(gè)元素作為基準(zhǔn)(通常選第一個(gè)元素弥搞,但最佳選擇方法是從待排序元素中隨機(jī)選取一個(gè)作為基準(zhǔn)),稱為基準(zhǔn)元素渠旁;
 * 2.將待排序的元素進(jìn)行分區(qū)攀例,比基準(zhǔn)元素大的元素放在它的右邊,比其小的放在它的左邊顾腊;
 * 3.對(duì)左右兩個(gè)分區(qū)重復(fù)以上步驟直到所有元素都是有序的粤铭。
 */
public void quick_sort(int[] arr,int _left,int _right){
    int left=_left;
    int right=_right;
    int temp=0;
    //待排序元素至少有1個(gè)
    if(left<=right){
       temp=arr[left]; //待排序的第一個(gè)元素作為基準(zhǔn)元素
        while(left!=right){ //從左右兩邊交替掃描,直到left = right

            while(right>left && arr[right]>=temp)
                right--;  //從右往左掃描杂靶,找到第一個(gè)比基準(zhǔn)元素小的元素
            arr[left]=arr[right]; //找到這種元素arr[right]后與arr[left]交換

            while(left<right && arr[left]<=temp)
                left++;   //從左往右掃描梆惯,找到第一個(gè)比基準(zhǔn)元素大的元素
            arr[right]=arr[left]; //找到這種元素arr[left]后,與arr[right]交換
        }
        arr[right]=temp; // 基準(zhǔn)元素歸位
        quick_sort(arr,_left,left-1); //對(duì)基準(zhǔn)元素左邊的元素進(jìn)行遞歸排序
        quick_sort(arr,right+1,_right); //對(duì)基準(zhǔn)元素右邊的進(jìn)行遞歸排序
    }
}

三吗垮、堆排序

堆排序
堆排序算法JAVA實(shí)現(xiàn)

/**
 * 堆排序
 * 基本思想:
 * 首先垛吗,堆分為最大堆和最小堆,最大堆則是指在一棵樹中烁登,父結(jié)點(diǎn)總是比子結(jié)點(diǎn)大怯屉,堆頂是整棵樹中的最大值,
 * 同樣的最小堆則是父結(jié)點(diǎn)都比子結(jié)點(diǎn)要小饵沧,堆頂則是最小值锨络。
 *
 * 排序的過程則是將數(shù)組根據(jù)要排列的順序去決定是排最大堆還是最小堆,建完堆以后將堆頂?shù)闹等〕龊螅? * 重新將堆進(jìn)行調(diào)整狼牺,調(diào)整后的值同樣滿足堆的性質(zhì)羡儿,接著再取出,以此類推是钥。
 */
/**
 * (最大)堆的向下調(diào)整算法
 * 注:數(shù)組實(shí)現(xiàn)的堆中掠归,第N個(gè)節(jié)點(diǎn)的左孩子的索引值是(2N+1),右孩子的索引是(2N+2)悄泥。
 * 其中拂到,N為數(shù)組下標(biāo)索引值,如數(shù)組中第1個(gè)數(shù)對(duì)應(yīng)的N為0码泞。
 * @param arr
 * @param start
 * @param end
 */
public void maxHeapDown(int[] arr,int start,int end){
    int current=start; //當(dāng)前節(jié)點(diǎn)位置兄旬,即父親節(jié)點(diǎn)
    int left=2*current+1; //左孩子的位置
    while(left<=end){ //子節(jié)點(diǎn)在范圍內(nèi)才進(jìn)行調(diào)整
        //選擇子節(jié)點(diǎn)中大的值
        if(left+1<=end && arr[left]<arr[left+1])
            left++;
        if(arr[current]>arr[left])
            break; //調(diào)整結(jié)束
        else{  //否則繼續(xù)和孫節(jié)點(diǎn)進(jìn)行比較
            swap(arr,current,left);
            current=left;
            left=2*current+1;
        }
    }
}

public void heap_sort(int[] arr,int len){
    //初始化,從i最后一個(gè)父親節(jié)點(diǎn)開始調(diào)整
    for(int i=len/2-1;i>=0;i--)
        maxHeapDown(arr,i,len-1);
    //先將第一個(gè)元素和后面的元素進(jìn)行交換,再調(diào)整
    for(int i=len-1;i>0;i--){
        swap(arr,0,i);
        maxHeapDown(arr,0,i-1);
    }
}

四领铐、冒泡排序

冒泡排序算法JAVA實(shí)現(xiàn)

  /**
 * 冒泡排序
 * 基本思想:在要排序的一組數(shù)中悯森,對(duì)當(dāng)前還未排好序的范圍內(nèi)的全部數(shù),自上而下對(duì)相鄰的兩個(gè)數(shù)依次進(jìn)行比較和調(diào)整绪撵,
 *         讓較大的數(shù)往下沉瓢姻,較小的往上冒。即:每當(dāng)兩相鄰的數(shù)比較后發(fā)現(xiàn)它們的排序與排序要求相反時(shí)音诈,就將它們互換幻碱。
 * @param arr
 * @param len
 */
public void bubble_sort(int[] arr,int len){
    //躺數(shù)
    for(int i=0;i<len-1;i++){
        for(int j=0;j<len-1-i;j++){
            if(arr[j]>arr[j+1]){
                swap(arr,j,j+1);
            }
        }
    }
}

五、直接插入排序

直接插入排序算法JAVA實(shí)現(xiàn)

/**
 * 直接插入排序
 * 基本思想是:每次將一個(gè)待排序的記錄细溅,按其關(guān)鍵字大小插入到前面已經(jīng)排好序的子序列中的適當(dāng)位置褥傍,直到全部記錄插入完成為止。
 * 設(shè)數(shù)組為arr[0…n-1]喇聊。
 * 1.初始時(shí)恍风,arr[0]自成1個(gè)有序區(qū),無序區(qū)為arr[1..n-1]誓篱。令i=1
 * 2.將arr[i]并入當(dāng)前的有序區(qū)arr[0…i-1]中形成arr[0…i]的有序區(qū)間朋贬。
 * 3.i++并重復(fù)第二步直到i==n-1。排序完成窜骄。
 * @param arr
 * @param len
 */
public void insert_sort(int[] arr,int len){
    int i,j;
    for(i=1;i<len;i++){
        //如果arr[i]>arr[i-1],無需調(diào)整
       if(arr[i]<arr[i-1]){
           int temp=arr[i];
           //為arr[i]找位置,找到第一個(gè)比arr[i]小的元素锦募,然后把a(bǔ)rr[i]放在其后即可
           for(j=i-1;j>=0&&arr[j]>temp;j--){
               arr[j+1]=arr[j]; //移動(dòng)
           }
           arr[j+1]=temp;
       }
   }
}

六、簡(jiǎn)單選擇排序

  /**
 * 簡(jiǎn)單選擇排序
 * 基本思想:
 * 首先在未排序序列中找到最辛诙簟(大)元素糠亩,存放到排序序列的起始位置,
 * 然后党远,再?gòu)氖S辔磁判蛟刂欣^續(xù)尋找最小(大)元素富弦,然后放到已排序序列的末尾沟娱。以此類推,直到所有元素均排序完畢腕柜。
 * @param arr
 * @param len
 */
public void select_sort(int[] arr,int len){
    for(int i=0;i<len-1;i++){
        int min=i;
        for(int j=i+1;j<len;j++){
            if(arr[j]<arr[min])
                min=j;
        }
        swap(arr,i,min);
    }
}

七济似、排序算法比較

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市盏缤,隨后出現(xiàn)的幾起案子砰蠢,更是在濱河造成了極大的恐慌,老刑警劉巖唉铜,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件台舱,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)竞惋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門柜去,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拆宛,你說我怎么就攤上這事嗓奢。” “怎么了浑厚?”我有些...
    開封第一講書人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵股耽,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我钳幅,道長(zhǎng)物蝙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任贡这,我火速辦了婚禮茬末,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盖矫。我一直安慰自己丽惭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開白布辈双。 她就那樣靜靜地躺著责掏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪湃望。 梳的紋絲不亂的頭發(fā)上换衬,一...
    開封第一講書人閱讀 52,807評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音证芭,去河邊找鬼瞳浦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛废士,可吹牛的內(nèi)容都是我干的叫潦。 我是一名探鬼主播,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼官硝,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼矗蕊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起氢架,我...
    開封第一講書人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤傻咖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后岖研,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卿操,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了硬纤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片解滓。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖筝家,靈堂內(nèi)的尸體忽然破棺而出洼裤,到底是詐尸還是另有隱情,我是刑警寧澤溪王,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布腮鞍,位于F島的核電站,受9級(jí)特大地震影響莹菱,放射性物質(zhì)發(fā)生泄漏移国。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一道伟、第九天 我趴在偏房一處隱蔽的房頂上張望迹缀。 院中可真熱鬧,春花似錦蜜徽、人聲如沸祝懂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)砚蓬。三九已至,卻和暖如春盆色,著一層夾襖步出監(jiān)牢的瞬間灰蛙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工隔躲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摩梧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓宣旱,卻偏偏與公主長(zhǎng)得像仅父,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子响鹃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361

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

  • 概述排序有內(nèi)部排序和外部排序驾霜,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序案训,而外部排序是因排序的數(shù)據(jù)很大买置,一次不能容納全部的...
    Luc_閱讀 2,280評(píng)論 0 35
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序强霎,而外部排序是因排序的數(shù)據(jù)很大忿项,一次不能容納全部...
    蟻前閱讀 5,191評(píng)論 0 52
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大轩触,一次不能容納全部...
    每天刷兩次牙閱讀 3,733評(píng)論 0 15
  • 排序的基本概念 在計(jì)算機(jī)程序開發(fā)過程中寞酿,經(jīng)常需要一組數(shù)據(jù)元素(或記錄)按某個(gè)關(guān)鍵字進(jìn)行排序,排序完成的序列可用于快...
    Jack921閱讀 1,438評(píng)論 1 4
  • 1 初級(jí)排序算法 排序算法關(guān)注的主要是重新排列數(shù)組元素脱柱,其中每個(gè)元素都有一個(gè)主鍵伐弹。排序算法是將所有元素主鍵按某種方...
    深度沉迷學(xué)習(xí)閱讀 1,416評(píng)論 0 1