1. 归并排序
归并排序采用的是分治法思想;
基本思想:将待排序的元素分成大小大致相同的两个子集合,分别对两个子集合进行排序,最终将排好序的子集合合并成所要求的排序好的集合。
```
public static void merge(int[] arr, int left, int mid, int right, int[] temp) {
int i = left;
int j = mid + 1;
int t = 0;//临时数组的下标索引
//先将两个部分合并
while(i <= mid && j <= right) {
if(arr[i] <= arr[j]) {
temp[t] = arr[i];
t++;i++;
}
else {
temp[t] = arr[j];
t++;j++;
}
}
//如果左边的部分没有合并 则接着i继续合并
while(i <= mid) {
temp[t] = arr[i];
t++;i++;
}
//如果右边的部分没有合并 则接着j继续合并
while(j <= right) {
temp[t] = arr[j];
t++;j++;
}
//将temp里面的数组填充到数组的指定位置
t = 0;
int tempLeft = left;
while(tempLeft <= right) {
arr[tempLeft] = temp[t];
t++;tempLeft++;
}
}
//归并第一部分 分
public static void mergeSorted(int[] arr, int left, int right, int[] temp) {
if(left < right) {
int mid = (left + right) / 2;
mergeSorted(arr, left, mid, temp);
mergeSorted(arr, mid + 1, right, temp);
merge(arr, left, mid, right, temp);
}
}
```
2. 基数排序
基数排序是对传统桶排序的扩展,速度很快.基数排序是对传统桶排序的扩展,速度很快.
基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法
基数排序的次数取决于最高位的位数(千位4次, 百位3次 以此类推)
看下图例子,对{ 329, 457, 657, 839, 436, 720, 355 }进行基数排序:
<img src="https://img-blog.csdn.net/20180405192008567?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3p4enh6eDAxMTk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="这里写图片描述" style="zoom:67%;" />
```
public static void redixSort(int[] arr) {
int[][] bucket = new int[10][arr.length - 1];//就是桶里面所存的具体数值
int[] bucketElementCounts = new int[10];//每个桶所存放的元素个数
int max = arr[0];
for (int i = 0; i < arr.length; i++) {
if(max < arr[i]) max = arr[i];
}
int maxCount = (max + "").length();//先把max转成字符串 在看它的位数 就知道最大位数了
for (int i = 0; i < maxCount; i++) {
for (int k = 0; k < arr.length; k++) {
int value = arr[k] / (int)Math.pow(10, i) %10;//得到arr[k]在i的位数 如arr[0] = 19, i = 0, value = 9;
bucket[value][bucketElementCounts[value]] = arr[k];//例如value = 1, bucketElementCounts[1] = 0代表此时个位数为0的桶里元素数目为0,bucket[1][0] = arr[k] 含义为个位数为1的桶里第一个元素为 arr[k]
bucketElementCounts[value]++;
}
int index = 0;
for (int k = 0; k < bucketElementCounts.length; k++) {//遍历每个桶
if(bucketElementCounts[k] != 0) {
for (int x = 0; x < bucketElementCounts[k]; x++) {
arr[index] = bucket[k][x];
index++;
}
}
bucketElementCounts[k] = 0;
}
}
}
```
3. 堆排序
参考文献:
[各种排序算法总结(全面)-CSDN博客](https://blog.csdn.net/zxzxzx0119/article/details/79826380)
[冒泡排序_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV1dV411U7VN?p=2&vd_source=66392ef2b6adca91c89d3d4e302e5a97)
[归并排序算法(java实现)_java归并排序-CSDN博客](https://blog.csdn.net/qq_45954420/article/details/123412430)