排序按类别分为:插入排序(插入排序、希尔排序)、选择排序(选择排序、堆排序)、交换排序(冒泡排序、快速排序)、归并排序、基数排序。
1. 冒泡排序
/**
* 从第一个数据开始,将顺序表中的每一个数据与其后一个数据比较大小 如果比后边大,就交换位置, 直到倒数第二个与倒数第一个比较完毕
* 我们可以得到最大的数,放在队尾, 不断循环执行,直到数组有序
*/
public static void bubbleSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
2. 选择排序
/**
* 选择数列中下表为0的数作为index,将其后面的数与index指向的数作比较
* 若后面的数比index指向的数小,就把index指向后面的数,直到比较到数列尾,
* 此时指向数列中最小的数,然后选择下标为1的数作为index,继续进行选择排序,直到结束
*/
public static void selectSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}
3. 归并排序
/**
* 将一个数列从中间分为两个有序的数列,然后再将两个数列按照从小到大的顺序合并成一个有序数列
* 时间复杂度:O(nlogn)
* 空间复杂度:O(N),归并排序需要一个与原数组相同长度的数组做辅助
*
* 稳定性:归并排序是最稳定的排序算法,
* 当左右部分值相等时,
* 先复制左边的值,保证两个值相等的元素的相对位置不变
*/
public static void mergeSort(int arr[], int left, int right){
if(left == right){
return;
}else{
int mid = (left+right)/2;
mergeSort(arr, left, mid);
mergeSort(arr, mid+1, right);
merge(arr, left, mid, right);
}
}
public static void merge(int[] arr, int left, int mid, int right){
int[] tmp = new int[right - left + 1];
int i = 0;
int p1 = left;
int p2 = mid+1;
// 比较左右两部分元素,那个小,把那个元素填入tmp中
while(p1 <= mid && p2 <= right){
tmp[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2