//选择排序,注意内外循环之间有对应的关系
public static void selectionSort(int[] ary){
//先选中第一个数,然后从后面这一组元素中找到一个最小的,和前面的这个数交换
for(int i=0 ; i<ary.length-1 ; i++){//53814
for(int j=i+1 ;j<ary.length ; j++){
if( ary[j]<ary[i] ){//如果后面有比前面小的数,就交换
//交换 i <-> j
int temp = ary[i];
ary[i] = ary[j];
ary[j] = temp;
}
//System.out.print("i,j:" + i + "," +j);
//System.out.println(Arrays.toString(ary));
}
}
}
// 选择排序:通过n-1轮比较,每轮找到一个最小的放到前面。
// 12 3 45 25 46 75 15 12 52
// 6 3 8 4 2 5 9 1 排序的习惯是从小到大
//策略:先选中第一个数,然后从后面这一组元素中找到一个最小的,和前面的这个数交换
// 其次,i向后移一位,j从第三位(j+1)开始往后找,如果找到最小的数就和这个第二个数交换,以此类推,直到倒数第二个数结束。
// i从0到length-1,j从i+1开始到length
// if(ary[j]<ary[i])满足就交换
//
//每一轮结束后,对应的位置会出现最小的数
//冒泡排序
public static void bubbleSort(int[] ary){//只是内层循环中的数在比较,交换
for(int i=0; i<ary.length-1; i++){
for(int j=0 ;j<=ary.length-1-i ; j++){//53814
if(ary[j]>ary[j+1]){//比较内循环中的相邻两个数,如果前面的数比后面的数大,我们就交换一下
int temp=ary[j];//第一次i=0,j=0,ary[0]>ary[1],35814
ary[j]=ary[j+1];//第二次i=0,j=1,ary[1]<ary[2],35814
ary[j+1]=temp;//第三次i=0,j=2,ary[2]>ary[3],35184
//调试输出语句 //第四次 i=0,j=3,ary[3]>ary[4],35148 每一次循环一下,会将最大值放的对应的最大位置
}
}
}
}
// 冒泡排序:
// 策略:每次比较相邻的元素,如果前一个大交换,每轮比较会把最大的交换到最后,完成一个最大的排序。经过n-1轮比较排序完毕。冒泡就是比喻每次有一个大数飘到最后。
//轮号 i=0~<length-1 0-5=length-2-i 此时i=0
//j=0~length-2-i
//插入排序
public static void insertSort(int ary[]){//只是内层循环中的数在比较,交换
for(int i = 1; i<ary.length; i++){//注意此时i从1开始变化,第一个数默认不需要排序
int temp = ary[i];//将第一个数保持到temp变量中
int j;
for(j = i-1; j>=0; j--){ //j的变化范围是i-1,到0
if(temp<ary[j]){//第一次ary[j]就是ary[0]比较ary[0]和ary[1]的大小,如果ary[0]的值比ary[1]大的就将ary[0]的值赋值给ary[1]
ary[j+1] = ary[j];
}else{
break;
}
}
ary[j+1] = temp;//一轮比较完成后,才将保存在temp变量中的ary[i]值赋值给ary[j+1]位置,实现排序效果
//53814
//第一次 i=1,ary[1]=3 j=0,ary[0]=5,交换完就完成,因为j>=0
//第二次i=2,ary[2]=8 j=i-1=1,ary[1]=5,不用交换,j--,ary[0]=3,不交换,j-- 跳出循环体
//第三次i=3,ary[3]=6 j=i-1=2,ary[2]=8,待交换,接着j--,在比较,发现前面没有比6小的数,所有就将6和8交换,就结束了
//......
}
}
}
java实现冒泡排序,选择排序,插入排序算法详解
最新推荐文章于 2023-04-07 16:02:17 发布