选择排序

概念:

选择排序是一种原地排序(in-place)算法。在一组元素中,规定(你的规定就是选择)在某一索引上的元素和其后面的相比是最大的值或最小的值。所需的操作只在需要时才执行。

算法核心:(有升序和降序两种排序,这里选择升序排序)

1. 从当前索引向后寻找最小值。

2. 用当前索引的元素和最小值交换。

3. 重复执行1.2。

图解:

给定一个序列:   6 8 1 4 5 3 7 2    按升序排序

                            1 8 6 4 5 3 7 2    (考虑索引位置  0~7   1为当前索引位置下的最小元素)

                            1 2 8 6 5 4 7 3    (考虑索引位置  1~7   2为当前索引位置下的最小元素)如此迭代

                            1 2 3 8 6 5 7 4    (考虑索引位置  2~7)

                            1 2 3 4 8 6 7 5    (考虑索引位置  3~7)

                            1 2 3 4 5 8 7 6    (考虑索引位置  4~7)

                            1 2 3 4 5 6 8 7    (考虑索引位置  5~7)

                            1 2 3 4 5 6 7 8    (考虑索引位置  6~7)

代码:

//选择排序:选择某一位置,保证在此位置下,与后面的元素相比,它都是最大或最小的元素
	static void selectionSort(int[] array){
		//min表示:和后面的与元素相比,处于min位置的元素最小。
		int min = 0,temp;
		//最坏情况下需要排序的次数  array.length-1
		for (int i = 1; i < array.length; i++) {
			//需要排序的具体元素
			for (int j = i; j < array.length; j++) {
				/**
				 * 请注意看下面这层if逻辑判断,这是选择排序的精髓所在。
				 * 即原地排序,无论什么时刻,我都在这原地呆着,保证我(array[min])是最小的元素,
				 * 后面的元素你们来和我比较,我不动。如果值比我小,那么就把你的值复制给我,
				 * 你把我的值拿走,如此迭代,比较到最后一个元素为止。
				 */
				if(array[min] > array[j]){
					temp = array[min];
					array[min] = array[j];
					array[j] = temp;
				}
			}
			min++;
		}
	}

测试:

在控制台输入一个序列:

6 8 1 4 5 3 7 2

结果:

这是第1次排列:1 8 6 4 5 3 7 2 
这是第2次排列:1 2 8 6 5 4 7 3 
这是第3次排列:1 2 3 8 6 5 7 4 
这是第4次排列:1 2 3 4 8 6 7 5 
这是第5次排列:1 2 3 4 5 8 7 6 
这是第6次排列:1 2 3 4 5 6 8 7 
这是第7次排列:1 2 3 4 5 6 7 8 
排序后的数组元素:1,2,3,4,5,6,7,8

 

你可能感兴趣的:(算法)