排序:
冒泡排序:
冒泡排序原理:比较相邻的元素,如果前一个元素比后一个元素大,就交换两个元素的位置,同理如果从大到小。对每一个相邻元素做同样的工作,从开始第一对元素到结尾的最后一对元素,最终最后位置的元素就是最大值。
分析:所以冒泡排序会进行数组长度-1次排序。每次排序会进行数组长度-1再-当前第几次排序例(arr.length-1-i(i为第几次排序))的比较
代码实现:
for(int i = 0 ; i < arr.length-1 ; i++){//控制几次排序
for(int j = 0 ; j < arr.length-1-i ; j++){//控制当前排序进行几次比较
if(a[j] > a[j+1]){//这里是进行降序
int tem = a[j];//设置一个过度值来保存a[j]
//交换
a[j] = a[j+1];
a[j+1] = tem;
}
}
}
选择排序:
排序原理:每一次遍历的过程中,都假定第一个索引处的元素是最小值,和其他索引处的值依次进行比较,如果当前索引处的值大于其他某个索引处的值,则假定其他某个索引处的值为最小值。最后可以找到最小值所在的索引。交换第一个索引处和最小值所在的索引处的值.
分析:
1.定义两个数:
定义一个变量记录最小索引所在的索引,默认为于选择排序的第一个元素所在的位置。
定义一个数作为保存用的过渡值。
2.外层循环:控制排序的次数,因为到最后一位的时候就不用排,又因为索引的最大值为arr.length-1,所以要进行arr.length-2次排序。
3.内层循环:因为第一次排序,最大值或者最小值就会排到第一个位置,而第二次循环则是把次大或者次小的数放到最大值或者最小值的后面,所以索引的值就要是前一个排好的值的索引+1的位置,然后此次循环的最小值要与最小值后面的每一个数进行比较,找出比赋的最小值小的数进行缩影交换。
实现:
int tem = 0;
for(int x = 0 ; x <= arr.length-2;x++){//也可以这样写:(x < arr.length-1 )
int minIndex = x;//这里就是得到当前最小值的缩影
for(int y = x+1 ; y <arr.length ; y++){//最小值与最小值后面的数进行比较
if(arr[x] > arr[y]){
tem = arr[x];
arr[x] = arr[y];
arr[y] = tem;
}
}
}
插入排序:
排序原理:
1.把所有元素分为两组,已经排序的和未排序的。
2.找到未排序的组中的第一个元素,向已经排序的组中进行插入。
3.倒叙遍历已经排序的元素,依次和待插入的元素进行比较,直到找到一个元素小于等于待插入元素,那么就把待插入元素放到这个位置,其他的元素向后移动一位。
实现:
外层循环:控制排序多少次
内层循环:进行倒叙,从已排序组的最后一位的索引处开始,往前比较,如果要插入的数,比最后一位数要大,那么放到最后一位数的前面,再与最后一位数的前一位数进行比较,依次类推
int[] arr = {23, 45, 12, 8, 3, 2, 55, 34, 87, 21};
int tem = 0;
for (int i = 1; i < arr.length; i++) {//外层循环,因为0索引处的值是已排序的,所以不用进行排序
for (int j = i; j > 0; j--) {//内层循环,因为进行倒叙,是用i位的值与前面已排序的那一组进行比较
if (arr[j - 1] > arr[j]) {
tem = arr[j];
arr[j] = arr[j-1];
arr[j-1] = tem;
}else {
break;
}
}
}
for ( int x =0 ; x< arr.length;x++){//遍历
System.out.print(arr[x]+" ");
}