Java【排序】

【冒泡排序】
1.原理
相邻元素两两比较,大的往后放,第一次比较完成后,最大值就已经排到了最后。
原数组:{3,8,15,6,2}
第一次排序:3和8比较 3<8,所以3的位置不变
8和15比 8<15,所以15的位置不变
15和6比 15>6,所以15和6交换位置
15和2再比 15>24,15和2位置交换
综上第一次排序得到的结果为:{3,8,6,2,15}
第二次排序方法同上,得到的结果为:{3,6,2,8,15}
第三次排序:{3,2,6,8,15}
第四次排序:{2,3,6,8,15}
2. 规律:两两比较,大的往后放,比较次数依次减1。

public class Bubble {
	public static void main(String[] args) {
		int[] a = {3,8,15,6,2};
		for(int n = 1;n <= a.length - 1;n++) {//一共要比较数组长度减1次
		for(int i = 0;i < a.length -n;i++) {
			//如果前一个元素比后一个元素大,那么就需要交换着两个元素的位置
			if(a[i] > a[i + 1]) {
				int temp = a[i];
				a[i] = a[i + 1];
				a[i + 1] = temp;
				}
			}
		}
		for(int i = 0;i < a.length ;i++) {
			System.out.println(a[i]);
		}
	}
}

【选择排序】
1.原理:
第一趟先找到数组中,最小元素的索引,
然后再将它和第一个元素交换位置,
再在剩下的元素中找最小元素的索引,再次交换位置。
待排序数组:{3,8,15,6,2}
第一次排序:最小数据是2,把2放在首位,也就是把2和3交换位置
排序结果:{2,8,15,6,3}
第二次排序:把除2以外的数据{8,15,6,3}进行排序,3最小,把3和8交换位置
排序结果:{2,3,15,6,8}
第三次排序:把除2,3以外的数据(15,6,8)进行排序,6最小,将6 与15交换位置
排序结果:{2,3,6,15,8}
第四次排序:把除2,3,6以外的数据(15,8)进行排序,8最小,将8 与15交换位置
排序结果:{2,3,6,8,15}
注:每一次排序获得最小数的方法用for循环进行比较

public class Select {
	public static void main(String[] args) {
		int[] a = {6,4,2,7,32,12,45};//定义一个数组进行排序
		/*
		 * 遍历一次数组,保存查找最小元素的索引
		 */
		for(int i = 0;i < a.length - 1;i++) {
			int min = i;
		/*
		 * 再遍历一次数组,再次找出最小元素的索引
		 */
			for(int j = a.length - 1;j > i;j--) {
				if(a[j] < a[min]) {
					min = j;
				}
			}
			int temp = a[i];
			a[i] = a[min];
			a[min] = temp;
		}
		for(int i = 0;i < a.length;i++) {
		System.out.print(a[i] + " ");
		}	
	}
}

插入排序
1.插入排序类似于我们平时打扑克牌的过程,我们每摸一次牌,都会对比手上已有的牌,然后将这张牌放到合适的位置。
2.核心思想:
把n个待排序的元素看成一个有序数列和无序数列,开始的时候,有序数列中只有1个元素,无序数列中有n - 1个元素;
每次从无序数列中取出第一个元素,将它插入到有序数列中去,使之成为新的有序表,重复n- 1次完成整个排序过程。
待排序数组:{ 48,32,2,54,23}
(1)第一次插入:首先将{48}看成一个有序数组,将{32,2,54,23},第一步需要做的是将无序数组的第一个元素32插入到有序数组中去,第一次排序得到的结果是{ 32,48,2,54,23};
(2)第二次插入:将{32,48}看成一个有序数组,{2,54,23}看成一个无序数组,将无序数组中的而第一个元素2插入到有序数组中
重复上述操作:可以发现有序数组最后一个元素是索引没插入一次结束后都加1。

public class 插入排序2 {

	public static void main(String[] args) {
		int[] a = { 48,32,2,54,23};
		/*
		 * 声明一个变量index来保存有序数组最后一个元素的索引
		 */
		for(int index = 0;index < a.length - 1;index++){
		/*
		 * 再声明一个变量来保存无序数组需要插入到有序数组的元素值
		 * 也就是需要插入的元素值
		 * 这里的index + 1 表示初始准备插入位置的索引
		 * 这个索引就是有序数组最后一个位置的索引+1
		 * 具体插在那个地方需要进行比较
		 */
		int temp = a[index + 1];
		/*
		 * 插入元素的索引位置
		 */
		int insert_index = index + 1;
		/*
		 * 寻找插入位置
		 * 从有序数组最后一个元素开始向前面做比较
		 */
		for(int i = index;i >= 0;i--) {
			if(temp < a[i]) {
				insert_index = i;
			}else {
				break;
			}
		}
		/*
		 * 找到插入位置之后,需要将这个位置之后的元素依次向后移动
		 */
		for(int i = index;i >= insert_index;i-- ) {
			a[i + 1] = a[i];
		}
		a[insert_index] = temp;
		}
		for(int i = 0;i < a.length;i++) {
			System.out.print(a[i] + " ");
		}
	}

}

猜你喜欢

转载自blog.csdn.net/weixin_44084434/article/details/90139334