publicstaticvoidinsertSort(int[] array){//有序区间[0,i)//无序区间[i,array.length)for(int i =1; i < array.length;i++){
int v = array[i];//无序区间第一个数
int j = i-1;//有序区间最后一个下标for(; j >=0&& array[j]> v;j--){
array[j+1]= array[j];}//如果不交换此时下标在i-1
array[j+1]= v;}}
publicstaticvoidshellSort(int[] arr){
int gap = arr.length /2;//将数组分为gap组while(gap >1){//传入组数和数组,带组数的插入排序insertSortGap(arr,gap);
gap = gap /2;}insertSortGap(arr,1);}privatestaticvoidinsertSortGap(int[] arr, int gap){//[0,i)为已排序区间;[i,arr.length)为未排序区间for(int i = gap ;i < arr.length;i++){
int v = arr[i];
int cur = i - gap;for(; cur >=0&& arr[cur]> v ;cur -= gap){
arr[cur+gap]= arr[cur];}
arr[cur + gap]= v;}}
publicstaticvoidquickSort(int[] arr){//借助helper方法进行递归//为了代码简单设置成前闭后闭区间[left,right]quickSortHelper(arr ,0,arr.length -1);}privatestaticvoidquickSortHelper(int[] arr, int left, int right){//判断数组元素有几个,如果有0个或者1个就无需排序,直接return;if(left >= right){return;}//通过partition对数组进行分区左侧为小于基准值,右侧为大于基准值//index 为整理后left和right重合的位置
int index =partition(arr ,left ,right);quickSortHelper(arr ,left , index -1);quickSortHelper(arr , index +1,right);}privatestatic int partition(int[] arr, int left, int right){
int i = left ;
int j = right ;
int base = arr[right];//将数组最后一个元素设为基准值//left < right 说明数组还没判断完while( i < j){while( i < j && arr[i]<= base){
i++;//循环结束后,要么i和j重回,要么i下标是一个比base值大的数}while( i < j && arr[j]>= base){
j--;//循环结束要么j和i重合,要么j下标是一个比base小的数}//交换i和j下标的元素swap(arr,i ,j);}//循环结束要将i或j(i和j此时在同一位置)位置的元素和right(基准值)元素进行交换swap(arr, i , right);//返回基准值位置return i;}privatestaticvoidswap(int[] arr, int i, int j){
int tmp = arr[i];
arr[i]= arr[j];
arr[j]= tmp ;}
publicstaticvoidquickSortByLoop(int[] arr){//通过栈来模拟实现递归
Stack<Integer> stack =newStack<>();//将数组左右位置下标入栈
stack.push(arr.length -1);
stack.push(0);while(!stack.empty()){//出栈顺序和入栈顺序相反
int left = stack.pop();
int right = stack.pop();//如果左右区间之间只有一个数证明已经有序 直接进行下一次循环if( left >= right){continue;}
int index =partition(arr , left ,right);//排序后的右区间[ index + 1 ,right]
stack.push(right);
stack.push(index +1);//排序后的左区间[left ,index - 1]
stack.push(index -1);
stack.push(left);}}privatestatic int partition(int[] arr, int left, int right){
int i = left ;
int j = right ;
int base = arr[right];//将数组最后一个元素设为基准值//left < right 说明数组还没判断完while( i < j){while( i < j && arr[i]<= base){
i++;//循环结束后,要么i和j重回,要么i下标是一个比base值大的数}while( i < j && arr[j]>= base){
j--;//循环结束要么j和i重合,要么j下标是一个比base小的数}//交换i和j下标的元素swap(arr,i ,j);}//循环结束要将i或j(i和j此时在同一位置)位置的元素和right(基准值)元素进行交换swap(arr, i , right);//返回基准值位置return i;}privatestaticvoidswap(int[] arr, int i, int j){
int tmp = arr[i];
arr[i]= arr[j];
arr[j]= tmp ;}