冒泡排序
1.相邻的数据两两比较,小的放前面,大的放后面。
2.第一轮比较完毕后,最大值已经确定了,第二轮可以少循环一次,后面依次类推。
3.如果数组中有n个数据,总共我们只执行n-1轮的代码就可以。
package MyApi.mysort;public class A01BubleDemo01 {public static void main(String[] args) {//1.定义数组int[] arr={2,4,5,3,1};//表示要执行多少轮for (int i = 0; i < arr.length-1; i++) {//内循环:表示每一轮中我我如何比较数据并找到当前的最大值//-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;}}}//遍历数组for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]+",");}}
}
选择排序
从0索引开始,拿着每一个索引上的元素跟后面的元素依次比较,小的放前面,大的放后面。
package MyApi.mysort;public class a02selectionDemo1 {public static void main(String[] args) {int[] arr={2,4,5,3,1};for (int i = 0; i < arr.length-1; i++) {for (int j =i+1; j< arr.length;j++) {if(arr[i]>arr[j]){int temp=arr[i];arr[i]=arr[j];arr[j]=temp;}}}printArr(arr);}private static void printArr(int[]arr){for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]+" ");}System.out.println();}
}
插入排序
将0索引的元素到N索引的元素看作是有序的,N+1索引的元素到最后一个当成是无序的。遍历无序的数据,将遍历到的元素插入有序序列中适当的位置,如遇到相同的数据,插在后面。
N的范围:0-最大索引
package MyApi.mysort;public class a03insertDemo {public static void main(String[] args) {int[]arr={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};//1.找到无序的哪一种数据是从那个索引开始的int startIndex=-1;for (int i = 0; i < arr.length; i++) {if(arr[i]>arr[i+1]){startIndex=i+1;break;}}//2.遍历从startIndex开始到最后一个元素,依次得到无序的那一组数据中的每一个元素for (int i = startIndex; i < arr.length; i++) {//记录当前要插入数据的索引int j=i;while(j>0&&arr[j]<arr[j-1]){int temp=arr[j];arr[j]=arr[j-1];arr[j-1]=temp;j--;}}}
}
递归算法
核心:
1.找出口:什么时候不在调用方法
2.找规则:如何把大问题变成规模较小的问题
package MyApi.mysort;public class a04RecursionDemo01 {public static void main(String[] args) {//1-100之间的和System.out.println(getSum(100));}public static int getSum(int number){if(number==1){return 1;}return number+getSum(number-1);}
}
package MyApi.mysort;public class a05RecursionDemo02 {public static void main(String[] args) {//求5!System.out.println(getJC(5));}public static int getJC(int number){if(number==1){return 1;}return number*getJC(number-1);}
}
快速排序
第一轮:把0索引的数字作为基准数,确定基准数在数组中正确的位置,比基准数小的全部在左边,比基准数大的全部在右边。
package MyApi.mysort;public class a06QuickSortDemo {public static void main(String[] args) {int[] arr={6,1,2,7,9,3,4,5,10,8};quickSort(arr,0,arr.length-1);for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");}}//参数一:我们要排序的数组//参数二:要排序数组的起始索引//参数三:要排序数组的结束索引public static void quickSort(int[] arr,int i,int j){
int start=i;
int end=j;
if(start>end){return;
}
//记录基准数int baseNumber=arr[i];//利用循环找到要交换的数字
while(start!=end){//利用end从后往前开始找,找比基准数小的数字
while(true){if(end<=start||arr[end]<baseNumber){break;}end--;
}//利用start,从前往后找,找比基准数大的数字if(end<=start||arr[start]>baseNumber){break;}start++;//把start和end指向的元素进行交换int temp=arr[start];arr[start]=arr[end];arr[end]=temp;
}
//当start和end指向同一个元素的时候,那么上面的循环就会结束//表示已经找到了基准数在数组中应存入的位置//基准数归位
int temp=arr[i];
arr[i]=arr[start];
arr[start]=temp;
//确定6左边的范围,重复刚才做的事情quickSort(arr,i,start-1);//确定6右边的范围,重复刚才做的事情quickSort(arr,start+1,j);}
}
Arrays
操作数组的工具类.