三种排序方法总结(java)——选择、冒泡、插入

以下三种排序默认将降序排列改为升序排列为目的

一.选择排序

选择排序是最好理解的排序方法,原理非常简单,就是从数组末尾找一个位置,将其余的元素中最大的选择出来放在该位置上,代码示例如下:

该方法的外循环从数组的最后一个元素遍历到第一个元素,每次遍历以array[i]的位置为目标位置。

因为外循环是从后往前遍历,所以i后面的元素是已经排好的顺序,所以内循环则是从第0个元素遍历到第i-1个元素,从这i个元素中找出最大的元素然后放在array[i]的位置上。

内循环中的语句用来判断当前array[i]位置上的元素和内循环遍历到的第j个元素谁大,如果是第j个元素大,则它理应待在array[i]的位置上,所以将这两个元素的位置进行交换。

package sort;

public class Choose {

	public static void main(String[] args) {
		int [] array= {7,6,5,4,3,2,1};
		for(int i=array.length-1;i>=0;i--) {
			for(int j=0;j<i;j++) {
				int temp=array[j];
				int current=array[i];
				if(temp>current) {
					array[j]=current;
					array[i]=temp;
				}
			}
		}
		
		for(int i:array) {
			System.out.println(i);
		}
	}
}

二.冒泡排序

我们都知道一个气泡从水底升到上面的过程中由于水的压强在不断变小所以气泡的体积是在不断变大的,冒泡排序所应用的也是这一原理。

在冒泡排序中每次遍历都从第0个元素开始,依次和下一个元素进行比较,如果大于下一个元素则与之交换位置然后继续和下一个比较,如果小于下一个元素则位置不变,使用下一个元素来和下一个位置的元素进行比较,一直比较到无序区的最后一个位置,然后该位置也变成有序区的第一个位置,一直到无序区的所有位置都变为有序区。代码示例如下:

由于每次冒泡后会将无序区的一个位置变为有序的,所以n个无序区的位置只需n-1次冒泡即可全部变为有序的,所以外循环的循环次数为n-1次。

由于第i次冒泡时无序区只有n-i个元素,所以内循环需要遍历n-i次即可。

内循环内部的代码就是对第j个元素和第j+1个元素进行比较,如果如果第j+1个元素较大则不做改动,如果第j个元素较大则将这两个元素交换位置。

package sort;

public class Pao {

	public static void main(String[] args) {
		int [] array = {7,6,5,4,3,2,1};
		for(int i=1;i<array.length;i++) {
			for(int j=0;j<array.length - i;j++) {
				int temp=array[j];
				int current=array[j+1];
				if(temp>current) {
					array[j]=current;
					array[j+1]=temp;
				}
			}
		}
		
		for(int i:array) {
			System.out.println(i);
		}
	}
}

三.插入排序

插入排序的原理是将无序区的第一个元素插入到有序区中,每次插入后有序区的位置就会多一个,所以n个元素全部变为有序需要外循环遍历n-1次。

插入排序外循环的内部总共分为三个步骤:

第一个步骤:寻找待插入的位置

第8行,temp是待插入的元素,也就是无序区的第一个元素。

第9到16行,将j定位到有序区的最后一个元素,然后从有序区的最后一个元素依次遍历到第0个元素,因为是在有序区,所以只要找到第一个比temp小的元素,此时j+1的位置就是temp待插入的位置了,该循环就没必要继续下去了,所以直接break。

第二个步骤:将待插入位置后面的元素依次向后移动

第18到20行,因为待插入的位置上是有元素的,所以为了将待插入元素插入进来需要将后面的元素依次往后挪一位,把待插入的位置让出来。

第三个步骤:第22行,将待插入元素插入到待插入位置

package sort;

public class Insort {

	public static void main(String[] args) {
		int [] array= {7,6,5,4,3,2,1};
		for(int i=1;i<array.length;i++) {
			int temp=array[i];
			int j=i-1;
			//寻找待插入的位置
			for(;j>=0;j--) {
				int current=array[j];
				if(temp>current) {
					break;
				}
			}
			//将待插入位置后面的元素依次向后移动
			for(int k=i;k>j+1;k--) {
				array[k]=array[k-1];
			}
			//将待插入元素插入到待插入位置
			array[j+1]=temp;
		}
		
		for(int i:array) {
			System.out.println(i);
		}
	}
}

发布了99 篇原创文章 · 获赞 93 · 访问量 5237

猜你喜欢

转载自blog.csdn.net/DangerousMc/article/details/100060523