计数排序
public class JiShuSort {
public static void main(String[] args) {
int[] arr={23,12,23,45,2,2,2,13};
countSort(arr);
}
//定义排序的方法
public static void countSort(int[] arr){
//求需要排序数组的最大值
int max=arr[0];
for(int a:arr){
if(max<a){
max=a;
}
}
//定义一个数组
int[] newarr=new int[max+1];
//循环遍历老数组 放在新数组中
for(int a:arr){
//将原始值 下标 次数---值
newarr[a]++;
}
//输出结果
for(int i=0;i<newarr.length;i++){//循环下标
for(int j=0;j<newarr[i];j++){//循环次数
System.out.print(i+"\t");
}
}
}
}
归并排序
import java.util.Arrays;
public class MergeSortFinal {
public static void main(String[] args) {
int[] arr = { 23, 12, 34, 56, 7, 65, 89, 2 };
chai(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
// 定义一个方法
public static void chai(int[] arr, int left, int right) {
// 出口
if (left >= right) {
return;
} else {
// 找规律
// 找中间的下标
int mid = (left + right) / 2;
// 左半部分 拆
chai(arr, left, mid);
// 右半部分 拆
chai(arr, mid + 1, right);
// 合并
merge(arr, left, right, mid);
}
}
public static void merge(int[] arr, int left, int right, int mid) {
// 整个数据集 left right
// 两个小数据集 左侧 left---mid 右侧 mid+1----right
// 1.创建一个新的数组 长度两个数组的长度之和
int[] newarr = new int[arr.length];
// 循环遍历两个数组
// 定义两个变量 分别记录每一个数组循环遍历的下标
int m = left; // 记录第左侧数据下标变化
int n = mid + 1; // 记录右侧数据集 下标变化
// 定义两个变量 记录两个数据集的最大下标的
int x = mid; // 左侧的最大下边的
int y = right; // 右侧最大下标的
// 变量 记录新数组的下标
int index = left;
// 只要两个数组都有元素 开始比较
while (m <= x && n <= y) {
// 开始进行比较 每一个数组去一个元素
if (arr[m] < arr[n]) {
newarr[index++] = arr[m++];
} else {
newarr[index++] = arr[n++];
}
}
// 出了循环
// 可能左侧 还有数据
while (m <= x) {
newarr[index++] = arr[m++];
}
// 可能是右侧还有数据
while (n <= y) {
newarr[index++] = arr[n++];
}
// 将newarr对应的排完序的元素 给arr重新赋值
// newarr left---right之间的元素 --- arr的 left--right
for (int i = left; i <= right; i++) {
arr[i] = newarr[i];
}
System.out.println(Arrays.toString(newarr));
}
}