Random ran =newRandom();int numBound =100;int numSub =5;int[] arr =newint[numSub];for(int i=0;i<arr.length; i++){
arr[i]= ran.nextInt(numBound);}System.out.println(Arrays.toString(arr));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]){int temp = arr[j];
arr[j]= arr[j+1];
arr[j+1]= temp;}}}System.out.println(Arrays.toString(arr));
选择排序
外层循环,可以确定一个最小的数 从i=0开始
次数 总个数-1
内层循环,进行第i个数(minIndex)与其他数对比,找出最小的值 从j=i开始
次数 总个数-1-i
Random ran =newRandom();int[] arr =newint[5];for(int i =0; i < arr.length; i++){
arr[i]=ran.nextInt(100);}System.out.println(Arrays.toString(arr));for(int i =0; i < arr.length-1; i++){int minIndex = i;for(int j = i+1; j < arr.length; j++){if(arr[minIndex]>arr[j]){int temp=arr[minIndex];
arr[minIndex]=arr[j];
arr[j]=temp;}}System.out.println(Arrays.toString(arr));
插入排序
外层循环 从i=1开始 每次可确定i个数的大小关系
次数 总个数-1 但因为是从1开始的所以判断应是 i<arr.length
内层循环 从j=i开始 与左侧元素对比
次数 不一定(break)方法
Random ran =newRandom();int[] arr =newint[5];for(int i =0; i <arr.length ; i++){
arr[i]= ran.nextInt(100);}System.out.println(Arrays.toString(arr));for(int i =1; i < arr.length; i++){for(int j=i ; j >0; j--){if(arr[j]<arr[j-1]){int temp = arr[j];
arr[j]=arr[j-1];
arr[j-1]=temp;}else{break;}System.out.println("j="+j);System.out.println(Arrays.toString(arr));}}System.out.println(Arrays.toString(arr));
希尔排序
利用插入排序的概念
并引入了增量的原则,利用三层for循环,进一步缩小了对比的次数
通过多次的相隔gap(增量)的对比 得到最后的有序数组
Random ran =newRandom();int[] arr =newint[5];for(int i =0; i < arr.length; i++){
arr[i]= ran.nextInt(50);}System.out.println(Arrays.toString(arr));/*
多轮循环:缩减增量
初始条件:增量(gap)值为数组长度/2
循环条件:增量>0
条件自变:增量自除2
*/for(int gap = arr.length/2; gap >0; gap/=2){/*
与增量大小相同的下标继续向右循环
*/for(int i = gap; i < arr.length; i++){/*
接下来的循环找左侧“同组”的元素进行对比及符合条件时换位
j为同组下标元素 注意不只有一个元素由于增量缩减所以需要向左循环到0
*/for(int j = i-gap; j >=0; j-=gap){/*
对比两个元素的大小
注意下标分别为 j+gap(i) 和 j 与左侧同组元素对比
*/if(arr[j+gap]<arr[j]){int temp = arr[j];
arr[j]= arr[j+gap];
arr[j+gap]= temp;}else{break;}}}}System.out.println(Arrays.toString(arr));