经典排序算法(二)选择排序
2016-11-14 23:01
351 查看
选择排序原理
选择排序是一种简单排序算法。这是一个基于位置比较的算法,通常实现是左边是已经排好序的元素列表,右边是待排序的元素。当然,一开始的时候,我们认为都是未经排序的。选择排序的精髓:与冒泡排序不同,选择排序是第N趟排序先确定最小元素的位置,然后和第N个元素交换位置。主要特点是每一趟选择一个最小值的索引作为梅一堂最后交换的位置。以一个元素个数为N的整形数组arr为例:
第一趟 以第一个元素arr[0]为基准,准备好一个中间变量temp用来记录该趟最小元素的位置,一开始,temp=0,比较arr[0]和arr[temp]的大小,若后者小于前者,则temp赋新值0,当前较小的值和第三个元素比较,将比较结果较小的索引赋给temp,以此类推,直至最后一个元素,这样第一趟下来,我们得到该数组最小元素的下标,然后交换第一个元素和下标为temp的元素值。
第二趟 第一趟已经将最小的元素放在第一个位置上了,因此以第二个元素开始,temp重新赋值为1,开始和它之后的元素比较,跟第一趟一样,最终得到第二小的元素放置在数组的第二个位置上。
第N趟 得到最大的元素放在数组末尾。
至此,选择排序算法结束,选择排序算法复杂度O(N),比较次数N-1、N-2、…、1,交换次数N。
选择排序工作流程
(本文章分享在CSDN平台,更多精彩请阅读 东陆之滇的csdn博客:http://blog.csdn.net/zixiao217)以下面的一个原始数组作为一个例子:
第一趟:以第一个元素14为基准,我们找到最小的元素10:
我们交换14和10,这样得到了最小的值放到数组第一个位置中:
第二趟:以第二个元素33为基准,往后找最小的数:
找到第二小的数14,交换第二个元素和14:
完成第二趟排序,至此第二小的元素已经放置在数组的第二个位置中。
后面的排序过程以此类推,以下是整个排序过程:
最后展示完整的选择排序代码:
package org.byron4j.sort; /** * * @author Byron.Y.Y * @version 1.0 * Java-选择排序-以整形数组为例 */ public class SelectionSort { /** * 注意:该方法仅仅展示选择排序的过程,并没有校验入参arr是否为null * @param arr */ public static void sort(int[] arr){ //数组长度 int size = arr.length; //每一趟的最小值在数组arr中的索引位置 int temp = 0; //中间值,用来交换 int tempVal = 0; /*外层循环控制选择排序的趟数*/ for( int i = 0; i < size; i++ ){ temp = i; //内层循环,走完一趟,得到该趟最小值所在的索引位置 for(int j = i+ 1; j < size; j++){ if( arr[j] < arr[temp] ){ temp = j; } } //最小值索引位置与当前基准元素位置不一致,则交换二者 if( temp != i ){ tempVal = arr[i]; arr[i] = arr[temp]; arr[temp] = tempVal; } //至此第i+1趟,排序完毕,将第i+1小的元素放在第i+1的位置上 //这里可以打印出来每一趟选择排序后数组的位置元素 System.out.print("第" + ( i + 1 ) + "趟: "); for(int k = 0; k < size; k++){ System.out.print(arr[k] + ((k != size -1) ? ", " : "")); } System.out.println(); } } public static void main(String[] args) { int[] arr = {14, 33, 27, 10, 35, 19, 42, 44}; sort(arr); } }
运行结果:
第1趟: 10, 33, 27, 14, 35, 19, 42, 44 第2趟: 10, 14, 27, 33, 35, 19, 42, 44 第3趟: 10, 14, 19, 33, 35, 27, 42, 44 第4趟: 10, 14, 19, 27, 35, 33, 42, 44 第5趟: 10, 14, 19, 27, 33, 35, 42, 44 第6趟: 10, 14, 19, 27, 33, 35, 42, 44 第7趟: 10, 14, 19, 27, 33, 35, 42, 44 第8趟: 10, 14, 19, 27, 33, 35, 42, 44
相关文章推荐
- 经典排序算法python回顾之二 选择排序
- 经典排序算法设计与分析(插入排序、冒泡排序、选择排序、shell排序、快速排序、堆排序、分配排序、基数排序、桶排序、归并排序)
- 经典排序算法----选择排序算法及交换两个数据的正确实现
- 【数据结构】Java实现各类经典排序算法——选择排序、冒泡排序
- 【经典排序算法】选择排序、堆排序
- 经典排序算法回顾:选择排序,快速排序
- 经典排序算法系列之二:选择排序
- 经典排序算法设计与分析(插入排序、冒泡排序、选择排序、shell排序、快速排序、堆排序、分配排序、基数排序、桶排序、归并排序)
- 经典排序算法(三)选择排序--C++
- 经典排序算法--选择排序
- 经典排序算法 - 选择排序
- 经典排序算法——选择排序
- 数据结构 C语言实现选择排序
- 【经典算法】第二回:选择排序
- 简单选择排序和冒泡排序
- DataTable各种方法总结(给Datatable添加行列、DataTable选择排序等
- 数据结构----简单选择排序
- 三个典型的经典算法冒泡排序,插入排序,选择排序
- 选择排序和冒泡排序的学习
- PHP 选择排序 案例