数组
直接插入排序
直接插入排序,是一种最简单的排序方法,他的基本操作是将一个记录插入到一个长度为m的有序表中,使之仍保持有序
package org.westos.demo01; public class ArraysDemo01{ public static void main(String[] args){ /* //直接插入排序:从1索引处开始,将后面的元素,插入之前的有序列表中使之仍保持有序 int[] arr = {3,2,1,0,10,20,30,7,8}; //外层循环定义伦次 //[2,1,3] for(int i = 1;i<arr.length;i++){ //里层循环进行比较插入 while(arr[i]<arr[i-1]){ int t = arr[i]; arr[i] = arr[i-1]; arr[i-1] = t; } } 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 t = arr[j]; //arr[j] = arr[j-1]; //arr[j-1] = t; swapValue(arr,j,j:j-1); } } System.out.println(Arrays.toString(arr)); } public static void swapValue(int[]arr,int i,int,j){ int t = arr[i]; arr[i] = arr[j]; arr[j] = t; } }
希尔排序
希尔排序又称为缩小增量排序
基本思想:先将原表按增量ht分组,每个子文件按照直接插入法排序。同样,用下一轮增量的ht/2将文件再分为子文件,再直接插入排序。直到ht=1时,整个文件排好序
选择合适的增量
package org.westos.demo02; public class ArraysDemo02{ public static void main(String[] args){ //希尔排序:他是对插入排序的一个优化,核心思想就是合理的选取增量,经过一轮排序后,让序列大致有序 //然后再不断的缩小增量,进行插入排序,直到增量为1,则排序结束 //直接插入排序,其实就是增量为的希尔排序 int[] arr = {46,55,13,42,17,94,5,70}; shellSort(arr); } public static void shellSort(int[] arr){ //定义一个增量 int h = 4; for(int i = h;i<arr.length;i++){ for(int j = i;j>0;j-=h){ if(arr[i]<arr[j-1]){ swapValue(arr,j,j:j-1); } } } //第二轮 int h = 2; for(int i = h;i<arr.length;i++){ for(int j = i;j>0;j-=h){ if(arr[i]<arr[j-h]){ swapValue(arr,j,j:j-h); } } } //第三轮 int h = 1; for(int i = h;i<arr.length;i++){ for(int j = i;j>0;j-=h){ if(arr[i]<arr[j-h){ swapValue(arr,j,j:j-h); } } } /* for(int h = 4;h>0;h/=2){ for(int i = h;i<arr.length;i++){ for(int j = i;j>0;j-=h){ if(arr[i]<arr[j-h){ swapValue(arr,j,j:j-h); } } } } */ //希尔排序的思想,合理的选取这个增量 //第一次这个增量选取数组的长度的一半,然后不断的减半 //选择数组长度一半,还不是很好,我们可以使用一种序列叫做克努特序列 //int h = 1; //h = h*3+1;//1,4,13,40,121,364 //根据克努特序列选取我们第一次的增量 int jiange = 1; while(jiange<=arr.length/3){ jiange = jiange*3+1; } // System.out.println(jiange); } public static void swapValue(int[]arr,int i,int,j){ int t = arr[i]; arr[i] = arr[j]; arr[j] = t; } }