1.冒泡排序
约定按照元素的大小升序排序
时间复杂度: O(N ^ 2)
空间复杂度: O(1)
- 基本思想:对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序。
package com.company;
public class Bubble {
/**
* @param arr
* @param a
* @param b
*/
public static void swap(int arr[], int a, int b) {
arr[a] = arr[a] + arr[b];
arr[b] = arr[a] - arr[b];
arr[a] = arr[a] - arr[b];
}
/**
* 冒泡排序,升序
*
* @param arr
*/
public static void bubbleSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
boolean flag = true;
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
flag = false;
}
}
if (flag == true) {
break;
}
}
}
}
2、选择排序
时间复杂度: O(N ^ 2)
空间复杂度: O(1)
稳定性: 不稳定
- 基本思想:每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止。打擂台思想。
package com.company;
public class Select {
/**
* 交换两数
* @param arr
* @param a
* @param b
*/
public static void swap(int[] arr, int a, int b){
arr[a] = arr[a] + arr[b];
arr[b] = arr[a] - arr[b];
arr[a] = arr[a] - arr[b];
}
/**
* 简单选择排序
* @param arr
*/
public static void slectSort(int[] arr){
for (int i = 0; i < arr.length; i++) {
// 每一趟循环比较时,min用于存放较小元素的数组下标,
int min = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[min]) {
min = j;
}
}
// 进行交换,如果min发生变换,则进行交换
if(min != i){
swap(arr, min, i);
}
}
// end for
}
}
3、插入排序
时间复杂度: O(N ^ 2)
空间复杂度: O(1)
稳定性: 稳定排序
- 基本思想:每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。
package com.company;
public class Insert {
public static void swap(int[] arr, int a, int b) {
arr[a] = arr[a] + arr[b];
arr[b] = arr[a] - arr[b];
arr[a] = arr[a] - arr[b];
}
public static void insertSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
for (int j = i; j > 0; j--) {
if (arr[j] < arr[j - 1]) {
swap(arr, j, j - 1);
}
}
}
}
}