简单选择排序
简单选择排序
一、算法介绍
简单选择排序属于选择类排序,主要动作就是“选择”,简单选择排序采用最简单的选择方式,从头至尾顺序扫描序列,找出最小的一个元素,和第一个元素交换,接着从剩下的元素中继续这种选择和交换,最终使序列有序。
二、算法流程
1.从先从原始数组的第一个元素开始,依次和后面的元素比较,如果第一个元素大,就交换,这样就将最小元素换到下标为0的位置上。
2.接着从第二个元素开始,依次和后面的元素比较,再将最小的元素换到下标为1的位置上。
3.以此类推,直到倒数第二个元素和最后一个元素比较完。
示意图如下:
可以推测出,简单选择排序在对N个数据进行排序时,无论原数据是否有序,都要进行N-1步的中间排序。
三、核心代码
1 for(int i=0;i<arr.length-1;i++){ //对N个元素排序,要进行N-1步的中间排序,这一点和冒泡排序一样,所以也是i<arr.length 2 for(int j=i+1;j<arr.length;j++){ //每一次中间排序都是某一位置上的元素和下一个元素开始比较,所以是j=i+1;且每次都是直到比较到最后一个元素结束,即j<arr.length 3 if(arr[i]>arr[j]){ //交换操作 4 int temp=arr[i]; 5 arr[i]=arr[j]; 6 arr[j]=temp; 7 } 8 } 9 }
四、测试代码
1 public class SimpleSelectSortDemo{ 2 public static void main(String args[]){ 3 int arr[]={49,38,65,97,76,13,1,-81,0,11}; 4 Sort d=new Sort(); 5 d.SimpleSelectSort(arr);} 6 } 7 class Sort{ 8 public void SimpleSelectSort(int[] arr){ 9 for(int i=0;i<arr.length-1;i++){ 10 for(int j=i+1;j<arr.length;j++){ 11 if(arr[i]>arr[j]){ 12 int temp=arr[i]; 13 arr[i]=arr[j]; 14 arr[j]=temp; 15 } 16 } 17 } 18 print(arr); 19 } 20 21 22 public void print(int[] arr){ 23 for(int i=0;i<arr.length;i++){ 24 System.out.print(arr[i]+" "); 25 } 26 } 27 }
最后,我又浏览了一下之前写的冒泡排序http://www.cnblogs.com/dazuihou/p/3627237.html 对比了一下两个算法的异同以便于理解记忆,假设N个元素的数组arr:
首先,冒泡排序和简单选择排序都是要进行N-1步的中间排序才能完成,所以外层循环是一样的,都是for(int i=0;i<arr.length-1;i++);
其次,冒泡排序每一趟中间排序都是从数组第一个元素开始比较(所以初始化表达式j=0是固定的),每一趟比较的元素都会少一个(所以循环条件表达式为j<arr.length-1-i是随着趟数变动的),因为每一趟比较都会把最大的一个挑出来放到后面。所以内层循环(控制着每一趟的比较)的代码为for(int j=0;j<arr.length-1-i;j++);而简单选择排序每一趟中间排序分别是从第一个元素,第二个元素,第三个元素....直到倒数第二个元素开始与紧跟其后面的元素依次比较(所以初始化表达式j=i+1是随着趟数变动的),每一趟比较都会比较到数组的最后一个元素(所以循环表达式为j<arr.length是固定的),每一趟比较都会把最小的一个挑出来放到前面。所以内层循环的代码为for(int j=i+1;j<arr.length;j++);
再次,冒泡排序每一趟比较并交换的是相邻的两个元素,所以为if(arr[j]>arr[j+1]),而简单选择排序每一趟比较并交换的是某一位置上的元素(根据趟数而变化)跟其之后的元素依次比较,所以为if(arr[i]>arr[j]).