java實現8 大排序演算法,不求最簡單,只求最容易理解
阿新 • • 發佈:2018-11-03
8 大排序演算法
排序演算法可以分為內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。
常見的內部排序演算法有:插入排序、希爾排序、選擇排序、氣泡排序、歸併排序、快速排序、堆排序、基數排序等。
ps:在網上看了一些排序演算法的實現方式,程式碼都很簡潔,但或許是思維習慣不同吧,感覺理解起來有些難度,就按照自己的邏輯,重新寫了一遍
1 插入排序
構建有效序列,對未排序的資料依次與已排序的資料比較,找到相應位置並插入
/**
* 插入排序
* 1.將第一元素看作有序序列
* 2.取出下一個元素,在已排序的序列從後向前掃描
* 3.比較:該元素大於新元素(未排序),則將該元素移到下一位置
* 4.重複3,直到找到該元素<=新元素,將新元素插入到該位置
* 穩定排序
* @param array
*/
public static void insertSort(int[] array) {
int length = array.length;
int temp = 0;
//從第二個元素(1)開始
for (int i = 1; i < length; i++) {
//當前迴圈要排序的資料
temp = array[i];
for (int j = i; j >= 0; j--) {
//第一個元素,特殊處理
if(j == 0){
array[j] = temp;
break;
}
//資料array[j-1]小於之前的資料時,將此資料後移一位
if(temp < array[j-1]) {
array[j] = array[j-1];
}else {
array[j] = temp;
break;
}
}
}
}
2 氣泡排序
重複比較相鄰的資料,如果順序不對,就交換它們的位置,直到最後一組
/**
* 氣泡排序法
* 穩定排序
* @param array
*/
public static void bubbleSort(int[] array) {
int t = 0;
//外層迴圈,每一趟將相對最大的資料放在後面
for (int i = 0; i < array.length - 1; i++) {
//內層迴圈,比較相鄰資料,最終把最大的元素放在後面
for (int j = 0; j < array.length -1 - i; j++) {
if(array[j] > array[j+1]){
t = array[j];
array[j] = array[j+1];
array[j+1] = t;
}
}
}
}
3 快速排序
選定一個基準值,將比基準值小的排到左側,大的排到右邊,再分別對兩部分進行排序,直到整個序列有序
ps:為方便理解,隨便定義一個概念
空位:即賦值過程中值被賦予其它位置的資料所在位置,此時該位置資料已被複制,因此變得可有可無,可視為空
/**
* 快速排序
* 不穩定排序
* @param array
*/
public static void quickSort(int[] array) {
if(array.length > 0){
quickSort(array, 0, array.length - 1);
}
}
private static void quickSort(int[] array,int left, int right) {
if(left < right){
int middle = getMiddle(array,left,right);
quickSort(array, left, middle - 1);
quickSort(array, middle + 1, right);
}
}
/**
* 獲取新的中軸值,並進行資料交換
* @param array
* @param left
* @param right
* @return
*/
private static int getMiddle(int[] array, int left, int right) {
//記錄中軸值
int temp = array[left];
//每一次迴圈完成左右兩個資料的交換,中軸改變
while(left < right){
//迴圈比較中軸值和右側資料,直到找到比中軸值小的資料
while(left < right && array[right] >= temp){
//遞減,直到找到空位(空位資料將被賦給中軸,左側較大資料會被賦給空位,中軸資料會被賦給新的中軸(即左側較大資料位置) )
//右空-中,左大-右空,中-左大,左大變成新中軸
//ps:隨便定義一個概念,空位:即複雜賦值過程中值被賦予其它位置的資料所在位置,此時該位置資料已被複制,因此變得可有可無
right--;
}
//比中軸小的移到左側,即:將比中軸值小的值(空位資料)賦給中軸位置
//右空-中
array[left] = array[right];
//迴圈比較中軸值和左側資料,直到找到比中軸大的資料
while(left < right && array[left] <= temp) {
//中軸位置改變
left++;
}
//比中軸大的移到右側,即:將左側較大資料賦給右側空位
//左大-右空
array[right] = array[left];
}
//中軸記錄到尾:中軸資料賦給新的中軸
array[left] = temp;
return left;
}
穩定:相同大小的資料在排序後順序不變