分類:
1)插入排序(直接插入排序、希爾排序)
2)交換排序(冒泡排序、快速排序)
3)選擇排序(直接選擇排序、堆排序)
4)歸並排序
5)分配排序(基數排序)
所需輔助空間最多:歸並排序
所需輔助空間最少:堆排序
平均速度最快:快速排序
不穩定:快速排序,希爾排序,堆排序。
1)插入排序
/**
* 直接插入排序,性能比冒泡和簡單選擇排序好
* 算法復雜度O(n*n)
* @param data
*/
public static void insertSort(int[] data) {
int temp = 0;
for (int i = 1; i < data.length; i++) {
int j = i - 1;
temp = data[i];
for (; j >= 0 && temp < data[j]; j--) {
data[j + 1] = data[j]; //將大於temp的值整體後移一個單位
}
data[j + 1] = temp;
}
}
/**
* 希爾排序,是選取一個增量,對整個數組分組,然後對每個小部分使其有序,
* 最後對整個部分使其有序,時間復雜度是O(n^3/2),是一種不穩定排序
* @param data
*/
public static void shellSort(int[] data) {
double d1 = data.length;
int temp = 0;
while (true) {
d1 = Math.ceil(d1 / 2);
int d = (int) d1;
for (int x = 0; x < d; x++) {
for (int i = x + d; i < data.length; i += d) {
int j = i - d;
temp = data[i];
for (; j >= 0 && temp < data[j]; j -= d) {
data[j + d] = data[j];
}
data[j + d] = temp;
}
}
if (d == 1) {
break;
}
}
}
2)交換排序
/**
* 冒泡排序從下到大優化了的冒泡排序
* 冒泡排序的時間復雜度是O(n*n)
* @param data
* @return
*/
public static int[] sort(int[] data) {
int temp;
boolean flag = false;
for (int i = 0; i < data.length - 1; i++) {
flag = true;
for (int j = 0; j < data.length - i - 1; j++) {
if (data[j] > data[j + 1]) {
temp = data[j];
data[j] = data[j + 1];
data[j + 1] = temp;
flag = false;
}
}
//如果有一次內層循環沒有交換排序,則說明數組已經有序了,直接退出,不用進行下一輪冒泡循環,提高效率
if (flag) {
break; //可以注釋這一行,單步測試或者查看i的值即可驗證
}
System.out.println(i);
}
return data;
}
/**
* 快速排序,
* 選擇一個基准元素,通常選擇第一個元素或者最後一個元素,通過一趟掃描,
* 將待排序列分成兩部分,一部分比基准元素小,一部分大於等於基准元素,
* 此時基准元素在其排好序後的正確位置,然後再用同樣的方法遞歸地排序劃分的兩部分。
* @param data
*/
public static void quickSort(int[] data) {
quick(data);
}
private static int getMiddle(int[] list, int low, int high) {
int tmp = list[low]; //數組的第一個作為中軸
while (low < high) {
while (low < high && list[high] >= tmp) {
high--;
}
list[low] = list[high]; //比中軸小的記錄移到低端
while (low < high && list[low] <= tmp) {
low++;
}
list[high] = list[low]; //比中軸大的記錄移到高端
}
list[low] = tmp; //中軸記錄到尾
return low; //返回中軸的位置
}
private static void _quickSort(int[] list, int low, int high) {
if (low < high) {
int middle = getMiddle(list, low, high); //將list數組進行一分為二
_quickSort(list, low, middle - 1); //對低字表進行遞歸排序
_quickSort(list, middle + 1, high); //對高字表進行遞歸排序
}
}
private static void quick(int[] a2) {
if (a2.length > 0) { //查看數組是否為空
_quickSort(a2, 0, a2.length - 1);
}
}
*