冒泡排序,选择排序和插入排序

排序算法
这里先介绍一个冒泡算法

算法解析
所谓“冒泡排序”,可以从名称上理解。“冒泡”实际上就是指把值更大的元素放到数列的后面来(如果是从大到小排列,则反之),好像是这个元素“浮”了过来。
看一下冒泡排序的详细步骤:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比
    这个简单的来说就是第一个数与第二个数两两对比,比大小,大的数在和下一个数进行对比,然后将最大的比出来,这还没完,然后再次进行这样的循环对比找出第二大的数,依次进行,直到排完大小顺序
    这是一个排出你的班级的成绩大小的代码
    import java.util.Scanner;

public class Pa2 {

public static void main(String[] args) {
	// TODO Auto-generated method stub
	int [] a=new int [3];
	Scanner sc= new Scanner(System.in); 
	  for(int i=0;i<a.length;i++) {//这个代码我看出了自己的问题,自己打的代码还是不够多,实战太少,所以问题就多
		  a[i]=sc.nextInt();//这一行表示的是输入的数
		  
	  
		}for(int i=1;i<a.length;i++){//这几行就代表你的冒泡算法对于这个问题的具体处理,
	  for(int j=0;j<a.length-i;j++) {//对于这种过程复杂的,一定要懂得分解问题,先写几遍运算过程,然后找出规律,以此题为例子
			if(a[j]>a[j+1]) {//这个的规律就是都在重复相比找最大,然后调换顺序,然后这就是你的内循环,先明确内循环写什么,
				//还有就是数组用循环的时候一定要防止下标的溢出
				int temp=a[j];//你这三句代码是根据计算顺序来的,一定要注意啊,你顺序错了,你计算不就是出错了吗
				a[j]=a[j+1];
				a[j+1]=temp;
				
			}//这里我想说的是一定要明确那些代码是是准备原始数据,那些事计算的处理,哪些又是输出接过
		}
}for(int i=0;i<a.length;i++) {
	 //你这个输入结果的时候就是用的循环,输出的时候不用吗
	System.out.println(a[i]);
	  
	}

}
}
选择算法
选择算法和冒泡的算法有相同的也有不同的
相同的都是他们都前边的数与后面的数进行对比,根据大小进行调换顺序
不同的在于冒泡排序是两两对比,决出最大的,然后在两两对比,决出第二大的,依次进行,最终排序完成
而选择排序是什么的套路呢,他刚开始把你要排的数分为有序数组和无序数组,有序数组最初是是0个数无序数组最初是全部,然后第一个循环就是挑选最小的数,他是怎么挑选的呢,从无序数组中一一挑选,挑选出最小的数,然后标记他所在的位置,如果他这个位置不是第一位,也就是你想要排位的位置的时候,他们之间就要进行数值的交换
按照牛逼的人的说法是
选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
2.1 算法描述
n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下:
• 初始状态:无序区为R[1…n],有序区为空;
• 第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1…i-1]和R(i…n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1…i]和R[i+1…n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
• n-1趟结束,数组有序化了。
表现最稳定的排序算法之一,因为无论什么数据进去都是O(n2)的时间复杂度,所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。理论上讲,选择排序可能也是平时排序一般人想到的最多的排序方法了吧。
用代码进行解释、
package 算法;

public class Chose {

public static void main(String[] args) {
	// TODO Auto-generated method stub
	// 首先说明这是个选择排序的具体用法
	int[] a = { 20, 44, 52, 64, 33, 654, 76 };
	for (int j = 0; j < a.length - 1; j++) {//为什么是j < a.length - 1; ,原因是最后一个数不用进行排序了
		int min = j;//这个min是定义的要排序数的位置
		for (int i = j + 1; i < a.length; i++) {//为什么是int i = j + 1因为你第一个数是和第二个先进行比较的
			//在进行循环的嵌套的时候首先我们还是要考虑内层循环
			//选择循环的思路是从无序的数中一一对比,然后得出最大或者是最小的,进行位置标记,如果位置是他要进行
			//排序数的位置的本身,就进行数字的转移
			if (a[min] > a[i]) {//这个是判断排序的数与无序的数大小的的对比
				min = i;//位置的标记
			}
		}
		if (min != j) {//如果要进行排序的数的位置不是标记数的位置本身就要进行数值的互换
			int temp;//进行数值的互换需要设一个中间变量作为临时储存器
			temp = a[j];
			a[j] = a[min];
			a[min] = temp;

		}
	}
	for (int i = 0; i < a.length; i++) {
		System.out.println(a[i]);
	}
}

}
简单的可认为
记忆下标,记忆最小元素的位置
进行比较,交换值、
加外层循环重复进行比较,交换值
插入排序
先听我说几句
插入排序简单理解可以为从后往前移动,先第二个数与第一个数相比,诺第一个数比第一个大,第一个数往后移动,移动到第二个位置,第二个数插入第一个位置,到第三个数呢,与前两个数分别相比,然后移动,然后再插入,依次类推,得出排序;
所以他的内循环不用for循环,因为循环的次数未知啊
大佬的说法
插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
3.1 算法描述
一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
• 从第一个元素开始,该元素可以认为已经被排序;
• 取出下一个元素,在已经排序的元素序列中从后向前扫描;
• 如果该元素(已排序)大于新元素,将该元素移到下一位置;
• 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
• 将新元素插入到该位置后;
• 重复步骤2~5。
插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间
代码分析package 算法;

public class InsertionSort {

public static void main(String[] args) {
	// TODO Auto-generated method stub
	int[] a = { 20, 44, 52, 64, 33, 654, 76 };
	for(int i=0;i<a.length-1;i++) {		
	int current=a[i+1];//记录第二个数的值
	int j=i;
	while(j>=0&&a[j]>current) {//这是一种判断,第二个小于第一个的情况下
		a[j+1]=a[j];//然后给他移位置
		j--;//结束循环
	}
	a[j+1]=current;//此时j的值其实是-1,这样对应算法中的插入那一步
}
	for (int i = 0; i < a.length; i++) {
		System.out.println(a[i]);
	}
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值