快速排序
基本思想:從待排序區間選擇乙個基準值;遍歷待排區間,將小於等於基準值的放在基準值左邊,將大於基準值的放在基準值右邊;再將分好的兩個部分按照以上的方式繼續遍歷處理,直到小區間長度==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 刪除某個檔案或者資料夾...