我自己期待不久的下集! 快排and歸併

2021-10-10 05:15:25 字數 3124 閱讀 3906

快速排序

基本思想:從待排序區間選擇乙個基準值;遍歷待排區間,將小於等於基準值的放在基準值左邊,將大於基準值的放在基準值右邊;再將分好的兩個部分按照以上的方式繼續遍歷處理,直到小區間長度==1,代表整個區間已經有序了,小區間長度==0,表示小區間內沒有資料。

將「遍歷待排區間,將小於等於基準值的放在基準值左邊,將大於基準值的放在基準值右邊」的部分以下稱為partition操作!

舉個栗子!!

初始資料:3  5  2  7  9  4  6  8  3  7  5

選取基準值為3,則:2  3  3  5  7  9  4  6  8  7  5

左邊選取基準值為2,右邊選取基準值為7:2  3  3  5  7  9  4  6  8  7  5

則排序為:2  3  3  5  4  6  7  5  7  9  8  

再次選取基準值為5和9,則:2  3  3  4  5   5  6  7   7   8   9

(將區間繼續細化,直到小區間長度為0或者1,省略……)

最後結果為:2  3  3  4  5  5  6  7  7  8  9

partition操作的方法:

1.hoare 法:

預設最左邊的資料為key,先從right開始遍歷,遇到小於等於key的停止遍歷,再從left開始遍歷,遇到大於key的停止遍歷,此時交換left和right指向的資料,迴圈此操作,直到left和right指向同乙個資料,此時將key和left所在資料交換位置。

2.挖坑法:

預設選取最左邊的資料為基準值key,將key賦值到key(挖坑),沿用hoare中的左右遍歷,最後將key填坑到left和right共同指向的位置。

public static void quicksort(long array) 

private static void quicksortinternal(long array,int lowindex,int highindex)

int keyindex = partition(array, lowindex, highindex);

quicksortinternal(array, lowindex, keyindex - 1);

quicksortinternal(array, keyindex + 1, highindex);

}private static int partition(long array, int lowindex, int highindex)

private static void swap(long array, int index1, int index2)

private static int partition挖坑(long array, int lowindex, int hightindex)

array[leftindex] = array[rightindex];

while (leftindex < rightindex && array[leftindex] <= key)

array[rightindex] = array[leftindex];

}array[leftindex] = key;

return leftindex;

}private static int partition前後(long array, int lowindex, int highindex)

}swap(array, lowindex, separateindex - 1);

return separateindex - 1;

}private static int partitionhover(long array, int lowindex, int highindex)

while (leftindex < rightindex && array[leftindex] <= key)

swap(array, leftindex, rightindex);

}swap(array, lowindex, leftindex);

return leftindex;

}

時間複雜度最好情況下:o(n*log(n))                 空間複雜度最好情況下:o(log(n))

時間複雜度最壞情況下:o(n^2)                        空間複雜度最壞情況下:o(n)

時間複雜度平均情況下:o(n*log(n))                 空間複雜度平均情況下:o(log(n))                                 不穩定!!

歸併排序(二路歸併)

基本思想:將資料平均分成2份,分別對每份資料再次分成2份,以此類推直到區間內個數為0或者1,得到n份資料,再將n份逐步合併成乙個新的有序資料,最後再將資料從新陣列中搬回去。(分治法)

public static void mergesort(long array) 

private static void mergesortinternal(long array, int lowindex, int highindex)

int middleindex = (lowindex + highindex) / 2;

mergesortinternal(array, lowindex, middleindex);

mergesortinternal(array, middleindex, highindex);

合併兩個有序區間(array, lowindex, middleindex, highindex);

}private static void 合併兩個有序區間(long array, int lowindex, int middleindex, int highindex) else

}if (leftindex < middleindex)

} else

}// 最後,把資料從新陣列統一搬回去

for (int i = 0; i < size; i++)

}

時間複雜度:o(n*log(n))                 空間複雜度:o(n)             穩定!

排序完結,撒花!!✿✿ヽ(°▽°)ノ✿

2015對自己的期待!

時光如梭,2014年幹了什麼?2014年就是選擇了等待和被安排,回到了家鄉,回到了生我養我的地方 從繁忙到清閒,從希望到沒了方向,又一次迷茫又一次措手不及。這一年過的很不痛快!2015年應該也必須做出些改變,不可繼續患得患失,半個月已然已經過去,半個月讓自己有了什麼成長?2015之後的日子對自己的期...

我自己的BLOG

我的blog終於開始了,希望能與大家一起學習,一起進步 我最早接觸電腦是在上大學一年級的時候,那個時候不知道電腦是什麼東東,只是聽同學說過那個東西什麼都能做.真的有那麼神奇嗎 我第一次用電腦還是在計算機課上,上機實驗,每個人一台機器,心理感覺真的很爽,就是不會用 當把機器開啟的時候,進的是個dos系...

我自己的 psftp cmd

官網位址 建立遠端連線 open hostname open username hostname 操作遠端伺服器 cd change directory ls list put filename 上傳檔案 put r dir 上傳資料夾 delete filename dir 刪除某個檔案或者資料夾...