条件判断之for循环(一)

本文介绍了三种基本排序算法:选择排序、冒泡排序和插入排序。通过实例展示了每种排序的工作原理,包括每轮比较的过程,帮助理解如何运用for循环进行排序。同时指出,冒泡排序和插入排序在效率上的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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}     取出2temp=2)  

         temp8比,比8小,将2的位置赋值为大数(ary[1]=8)  {8|8,3,7,1} 

因为已到边界,直接赋值  (ary[0]=2)        得到{2,8|3,7,1}  28排序完成  

3步,用3“|”之前的所有元素比较,并插入                              {2,8|3,7,1}   取出3temp=3)  

       temp和8比,比8小,3的位置赋值给大数(ary[2]=8)  {2,8|8,7,1}  

        temp2比,比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));
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值