冒泡、选择、插入、希尔排序
冒泡排序
//冒泡排序 public class BubbleSort{ public static void main(String [] args){ int[] arr = new int[]{8,4,2,1,23,344,12}; for (int i=0; i<arr.length-1; i++){ for (int j=0; j< arr.length-1-i; j++){ if (arr [j] > arr [j+1]){ //从小到大 //if (arr [j] > arr [j+1]){ //从大到小 int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } for (int i=0; i<arr.length;i++){ System.out.println(arr[i]); } } }
选择排序
//选择排序 定义最后一位的坐标以及初始化默认第一位坐标为最大或最小 //比较次数不变 交换次数减少 public class SelectSort{ public static void main(String [] args){ int[] arr = new int[]{8,4,2,1,23,344,12}; for (int i=0; i<arr.length-1; i++){ int last = arr.length-1-i;//每轮的最后坐标 int max = 0;//最大数的坐标 初始第一个数是最大的 for (int j=1; j< arr.length-i; j++){//i=0时 j=1 代表第一个数跟第二个数对比 if (arr [max] < arr [j]){//从小到大 //if (arr [min] > arr [j]){ //从大到小 max = j;//有数比max更大 将下标赋给max; } } //每轮结束 将max与last交换 if (max != last){//等于时表示最后一位就是最大值 不需要交换 int temp = arr[max]; arr[max] = arr[last]; arr[last] = temp; } } for (int i=0; i<arr.length;i++){ System.out.println(arr[i]); } } }
插入排序
//插入排序 //比较次数减少 交换次数减少 public class InsertSort{ public static void main(String [] args){ int[] arr = new int[]{8,4,2,1,23,344,12}; for (int i=0; i<arr.length-1; i++){ int curr = arr[i+1];//获取要判断的数字 for(int j=i; j>=0; j--){ //从小到大 //if (curr < arr[j]){//curr:比较数 第一次循环的4 arr[j]:被比较数 第一次循环的8 //从大到小 if (curr > arr[j]){ arr[j+1] = arr[j]; //需要换座位时 把被比较数向后一位 } else { break;//如果前面小 直接退出当层循环 } arr[j] = curr;//将比较数插入新座位 } } for (int i=0; i<arr.length;i++){ System.out.println(arr[i]); } } }
希尔排序
//希尔排序 public class ShellSort{ public static void main(String [] args){ int[] arr = new int[]{8,4,2,1,23,344,12}; //分组插入 //计算步长 arr.length / 2 ==> 3; [8,1,12] [4,23] [2,344] //小组排序 [1,8,12] [4,23] [2,344] ==> [1,4,2,8,23,344,12] //重新计算步长 原步长/2 ==> 1; for (int jump = arr.length/2;jump>0;jump/=2) { for (int i=jump;i<arr.length;i++){//用每组第二个数的下标记录这一组 int value = arr[i];//获取要判断的数字 int j;//因为作用域 所以需要外部定义 //跟插入排序同理 j>=0:结束条件 value>arr[j]:比较数与被比较数比较条件 for (j=i-jump; j>=0 && value<arr[j]; j-=jump){//value:比较数 arr[j]:被比较数 arr[j+jump] = arr[j];//此时j要减步长 找到同组的数比较 } arr[j+jump] = value; } } for (int i=0; i<arr.length;i++){ System.out.println(arr[i]); } } }