1. 关键术语总结
1. 稳定 :如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
2. 不稳定 :如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面。
3. 内排序 :所有排序操作都在内存中完成。
4. 外排序 :由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行。
5. 时间复杂度 : 一个算法执行所耗费的时间。
6. 空间复杂度 :运行完一个程序所需内存的大小。
2. 排序算法比较表

3. 排序算法分类

4. 类Sort
package sort;
public class Sort {
public void insertionSort(int[] arrs) {
int n = arrs.length;
for (int i = 0; i < n; i++) {
for (int j = i; j > 0; j--) {
if (arrs[j] < arrs[j - 1])
swap(arrs, j, j - 1);
else
break;
}
}
}
private void swap(int[] arrs, int i, int j) {
int temp = arrs[i];
arrs[i] = arrs[j];
arrs[j] = temp;
}
public static void testOfInsertionSort() {
int[] arrs = { 5, 11, 1, 0, -1, 15, 20, 100, -99 };
Sort sort = new Sort();
sort.insertionSort(arrs);
for (int i = 0; i < arrs.length; i++) {
System.out.print(arrs[i]);
System.out.print(" ");
}
}
public void shellSort(int[] arrs) {
int n = arrs.length;
for (int step = n / 2; step >= 1; step /= 2) {
for (int i = step; i < n; i++) {
for (int j = i; j > step - 1; j -= step) {
if (arrs[j - step] > arrs[j])
swap(arrs, j - step, j);
else
break;
}
}
}
}
public static void testOfShellSort() {
int[] arrs = { 5, 11, 1, 0, -1, 15, 20, 100, -99 };
Sort sort = new Sort();
sort.shellSort(arrs);
for (int i = 0; i < arrs.length; i++) {
System.out.print(arrs[i]);
System.out.print(" ");
}
}
public void bubbleSort(int[] arrs) {
int n = arrs.length;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (arrs[j] > arrs[j + 1]) {
swap(arrs, j, j + 1);
}
}
}
}
public void BubbleSort(int[] arrs) {
int n = arrs.length;
for (int i = 1; i < n; i++) {
boolean flag = true;
for (int j = 0; j < n - i; j++) {
if (arrs[j] > arrs[j + 1]) {
swap(arrs, j, j + 1);
flag = false;
}
}
if (flag) {
break;
}
}
}
public static void testOfBubbleSort() {
int[] arrs = { 5, 11, 1, 0, -1, 15, 20, 100, -99 };
Sort sort = new Sort();
sort.BubbleSort(arrs);
for (int i = 0; i < arrs.length; i++) {
System.out.print(arrs[i]);
System.out.print(" ");
}
}
public void quickSort(int[] arrs, int leftIndex, int rightIndex) {
if (leftIndex >= rightIndex) {
return;
}
int left = leftIndex;
int right = rightIndex;
int key = arrs[left];
while (left < right) {
while (right > left && arrs[right] >= key) {
right--;
}
arrs[left] = arrs[right];
while (left < right && arrs[left] <= key) {
left++;
}
arrs[right] = arrs[left];
}
arrs[left] = key;
quickSort(arrs, leftIndex, left - 1);
quickSort(arrs, right + 1, rightIndex);
}
public static void testOfQuickSort() {
int[] arrs = { 5, 11, 1, 0, -1, 15, 20, 100, -99 };
Sort sort = new Sort();
sort.quickSort(arrs, 0, arrs.length - 1);
for (int i = 0; i < arrs.length; i++) {
System.out.print(arrs[i]);
System.out.print(" ");
}
}
public void selectionSort(int[] arrs) {
int n = arrs.length;
int min;
for (int i = 0; i < n - 1; i++) {
min = i;
for (int j = i + 1; j < n; j++) {
if (arrs[j] < arrs[min]) {
min = j;
}
}
if (i != min)
swap(arrs, i, min);
}
}
public static void testOfSelectionSort() {
int[] arrs = { 5, 11, 1, 0, -1, 15, 20, 100, -99 };
Sort sort = new Sort();
sort.selectionSort(arrs);
for (int i = 0; i < arrs.length; i++) {
System.out.print(arrs[i]);
System.out.print(" ");
}
}
public void heapSort(int[] arrs) {
int n = arrs.length;
for (int i = n / 2 - 1; i >= 0; i--) {
adjustHeap(arrs, i, n);
}
for (int i = n - 1; i > 0; i--) {
swap(arrs, 0, i);
adjustHeap(arrs, 0, i);
}
}
private void adjustHeap(int[] arrs, int index, int length) {
int root = arrs[index];
for (int i = 2 * index + 1; i < length; i = i * 2 + 1) {
if (arrs[i] < arrs[i + 1] && (i + 1) < length) {
i++;
}
if (arrs[i] > root) {
arrs[index] = arrs[i];
index = i;
} else {
break;
}
}
arrs[index] = root;
}
public static void testOfHeapSort() {
int[] arrs = { 5, 11, 1, 0, -1, 15, 20, 100, -99 };
Sort sort = new Sort();
sort.heapSort(arrs);
for (int i = 0; i < arrs.length; i++) {
System.out.print(arrs[i]);
System.out.print(" ");
}
}
public int[] mergeSort(int[] arrs) {
int n = arrs.length;
int mid = n / 2;
int[] left = new int[mid];
int[] right = new int[n - mid];
if (n < 2) {
return arrs;
}
left = copyOfRange(arrs, 0, mid);
right = copyOfRange(arrs, mid, n);
return merge(mergeSort(left), mergeSort(right));
}
private int[] copyOfRange(int[] original, int start, int end) {
int newLength = end - start;
if (newLength < 0)
throw new IllegalArgumentException(start + " > " + end);
int[] copy = new int[newLength];
System.arraycopy(original, start, copy, 0, Math.min(original.length - start, newLength));
return copy;
}
private int[] merge(int[] left, int[] right) {
int[] result = new int[left.length + right.length];
int i = 0;
while (left.length > 0 && right.length > 0) {
if (left[0] < right[0]) {
result[i++] = left[0];
left = copyOfRange(left, 1, left.length);
} else {
result[i++] = right[0];
right = copyOfRange(right, 1, right.length);
}
}
while (left.length > 0) {
result[i++] = left[0];
left = copyOfRange(left, 1, left.length);
}
while (right.length > 0) {
result[i++] = right[0];
right = copyOfRange(right, 1, right.length);
}
return result;
}
public static void testOfMergeSort() {
int[] arrs = { 5, 11, 1, 0, -1, 15, 20, 100, -99 };
Sort sort = new Sort();
int[] result = sort.mergeSort(arrs);
for (int i = 0; i < result.length; i++) {
System.out.print(result[i]);
System.out.print(" ");
}
}
public static void main(String[] args) {
System.out.println("\r\n直接插入排序:");
testOfInsertionSort();
System.out.println("\r\n希尔排序:");
testOfShellSort();
System.out.println("\r\n冒泡排序:");
testOfBubbleSort();
System.out.println("\r\n快速排序:");
testOfQuickSort();
System.out.println("\r\n选择排序:");
testOfSelectionSort();
System.out.println("\r\n堆排序:");
testOfHeapSort();
System.out.println("\r\n归并排序:");
testOfMergeSort();
}
}
直接插入排序:
-99 -1 0 1 5 11 15 20 100
希尔排序:
-99 -1 0 1 5 11 15 20 100
冒泡排序:
-99 -1 0 1 5 11 15 20 100
快速排序:
-99 -1 0 1 5 11 15 20 100
选择排序:
-99 -1 0 1 5 11 15 20 100
堆排序:
-99 -1 0 1 5 11 15 20 100
归并排序:
-99 -1 0 1 5 11 15 20 100