幾種排序演算法實現以及穩定性
穩定性演算法:氣泡排序、插入排序、歸併排序、基數排序
不穩定性演算法:選擇排序、快速排序、堆排序、希爾排序、桶排序
/**
*
* @author huangsen
* 插入排序:一個有序陣列,一個無序陣列,將無序陣列插入到有序陣列中
*
*/
public class InsertSortDemo {
public static void insertSort(int[] arr) {
for(int i = 1; i < arr.length; i++) {
int temp = arr[i];
int j;
for(j = i -1; j>=0; j--) {
if(temp > arr[j]) {
break;
}else {
arr[j+1] = arr[j];
}
}
arr[j+1] = temp;
}
}
}
package com.hs.sort;
/**
*
* @author huangsen
* 歸併排序:採用分治思想,對一個數組的排序,我們可以將他分成兩個陣列來處理,再對這兩個陣列同樣的道理來處理,
* 將他們分別分成兩個陣列來處理…… 直到陣列無法再細分下去(即陣列的長度為1,只有一個元素的陣列肯定是有序的),
* 分為之後的陣列進行合併操作,向上整合整個陣列,最後到達得到一個有序的陣列的目的。
*
*/
public class MergeSortDemo {
public static void mergeSort(int[] arr, int start, int end) {
if(start<end) {
int mid = (start + end)/2;
mergeSort(arr, start, mid);
mergeSort(arr,mid + 1, end);
merge(arr, start, mid, mid + 1, end);
}
}
public static void merge(int[] arr, int start1, int end1, int start2, int end2) {
int i = start1;
int j = start2;
int k = 0;
int[] a = new int[end2-start1+1];
while((i<=end1) && (j<=end2)) {
if(arr[i]<arr[j]){
a[k] = arr[i];
k++;
i++;
}else {
a[k] = arr[j];
k++;
j++;
}
}
while(i<=end1) {
a[k++] = arr[i++];
}
while(j<=end2) {
a[k++] = arr[j++];
}
for(int m = 0; m<a.length; m++)
arr[m+start1] = a[m];
}
}
package com.hs.sort;
/**
* @author huangsen
* 選擇排序:在要排序的一組數中,選出最小的一個數與第一個位置的數交換;然後在剩下的數當中再找最小的與第二個位置的數交換,如此迴圈到倒數第二個數和最後一個數比較為止。
*
*/
public class SelectSortDemo {
public static void selectSort(int[] arr) {
for(int i = 0; i<arr.length; i++) {
int k = i;
for(int j = i+1; j<arr.length; j++) {
if(arr[j]<arr[k]) {
k = j;
}
}
if(k>i) {
int temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
}
}
}