For循环的小插曲
对于for循环之前并没有什么理解,只是知道起结构是由三部分组成,一是申明变量,二是执行条件,三是运算方式。
遇到的一般也就是单个的for循环,直到接触排序,使用了嵌套循环的方式。从开始接触到排序,第一想法还不会是说去做循环,直到动手做了,才发现自己对for循环解读还是不到位。
那么就来做做三个排序方式,选择排序;冒泡排序;插入排序。
一、选择排序
选择排序原理:
将数组中每个元素与第一个元素比较,如果这个元素小于第一个元素,则交换这两个元素,循环第1条规则,找出最小元素,放于第1个位置,经过n-1轮比较完成排序。 简单而言,每轮都找到最小的放到前面。
举例:{8 , 2 , 3 , 7 , 1}的排序过程如下所示:
数组: ary={8 , 2 , 3 , 7 , 1}
第1轮: ary={1 | 8 , 3 , 7 , 2}
第2轮: ary={1 , 2 | 8 , 7 , 3}
第3轮: ary={1 , 2 , 3 | 8 , 7}
第4轮: ary={1 , 2 , 3 , 7 | 8}
于是乎,我是这样没有思考的写出这样 的方法:
for (int i = 1; i < arr.length; i++) {
for (int j = 0; j < i; j++) {
if(arr[i]<arr[j]){
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
System.out.println(Arrays.toString(arr));
}
这样写的代码运行后,确实可以得到想要的代码,但确与真正的选择排序有点差别,这只是阴差阳错的做了一个数组的数字排序。
[2, 8, 7, 3, 1]
[2, 7, 8, 3, 1]
[2, 3, 7, 8, 1]
[1, 2, 3, 7, 8]
实际的需求是这样满足的:
public class sort1 {
public static void main(String[] args) {
int arr[] = {8,2,3,7,1};
int temp = 0;
for (int i = 0; i < arr.length-1; i++) {//取第一个元素
for (int j = i+1; j < arr.length; j++) {//第一个元素与之后的元素比较
if(arr[i]>arr[j]){
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
System.out.println(Arrays.toString(arr));
}
}
}
ps:嵌套应该由小区间的或者小范围的数组与大区间的数组做比较。
二、冒泡排序
冒泡排序原理:
比较相邻的元素,将小的放到前面,比较一轮后,最大的就放到最后面,经过n-1轮的比较完成排序。
冒泡排序举例:{8 , 2 , 3 , 7 , 1}的排序过程如下所示:
数组: ary = {8 , 2, 3, 7, 1}
第1轮:ary={2,3,7,1|8}
第2轮:ary={2,3,1|7,8}
第3轮:ary={2,1|3,7,8}
第4轮:ary={1,|2,3,7,8}
public class sort2 {
public static void main(String[] args) {
int arr[] = {8,2,3,7,1};
int temp;
for (int i = 0; i < arr.length-1; i++) {//比较轮数
for (int j = 0; j < arr.length-i-1; j++) {
if(arr[j] > arr[j+1]){//与相邻元素做比较
temp = arr[j];//用空变量做容器换值
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
System.out.println(Arrays.toString(arr));
}
}
}
三、插入排序
将数组分为两部分, 将后部分的第一个逐一与前部分每一个元素比较,在合理位置插入
插入排序算法效率要高于选择排序和冒泡排序
•第1步,假设第一个元素是已排序的; {8|2,3,7,1}
•第2步,用2和“|”之前的所有元素比较,并插入 {8|2,3,7,1} 取出2(temp=2)
temp和8比,比8小,将2的位置赋值为大数(ary[1]=8) {8|8,3,7,1}
因为已到边界,直接赋值 (ary[0]=2) 得到{2,8|3,7,1} 2和8排序完成;
•第3步,用3和“|”之前的所有元素比较,并插入 {2,8|3,7,1} 取出3(temp=3)
temp和8比,比8小,3的位置赋值给大数(ary[2]=8) {2,8|8,7,1}
temp和2比,比2大,插入2后面 (ary[1]=3) {2,3,8|7,1} 3、2、8排序完成;
以些类推…
public class Sort3 {
public static void main(String[] args) {
int[] arr = {8,3,2,7,1,6};
int temp;
System.out.println("排序前"+Arrays.toString(arr));
for (int i = 1; i < arr.length; i++) {
temp = arr[i];//将插入的数据放入临时变量
int j;
/*若取arr中第四位元素(i=3),取该元素与前面的值比较
所以j的初始值为i-1,循环退出的条件为j为第一位元素,
或者第i位元素与arr[j-1](i的左边)比较偏小也停止继续比较。*/
for (j = i;(j>0 && temp<arr[j-1]); j--) {
arr[j] = arr[j-1];//大的值右移
}
arr[j] = temp;
}
System.out.println("排序后:"+Arrays.toString(arr));
}
}