选择排序

来源:互联网 发布:笑郭网络验证4.6 编辑:程序博客网 时间:2024/06/06 18:11

1、选择排序基本思想
选择排序主要是从待排序列中选取一个关键字值最小的记录,把它与第一个记录交换存储位置,使之称为有序。然后在余下的无序的记录中,再选出关键字最小的记录与无序区中的第一个记录交换位置,又使它成为有序。依此类推,直至完成整个排序。

思想分解:
a、初始状态:整个数组r划分成两个部分,即有序区(初始为空)和无序区。
b、基本操作:从无序区中选择关键字最小的记录,将其与无序区的第一个记录交换位置(实质是添加盗了有序区的尾部).
c、从初态(有序区为空)开始,重复步骤b,直到终态(无序区为空)

2、选择排序算法代码如下:

public class SelectSort {    public void selectSort(int arr[]) {        int min;        int temp = 0;        for (int i = 0; i < arr.length; i++) {            min = i;// 将当前下标定义为最小值下标            for (int j = i + 1; j < arr.length; j++) {                if (arr[min] > arr[j]) {// 如果有小于当前最小值的关键字,将此关键字的下标值给min                    min = j;                }            }            if (i != min) {// 若min不等于i,说明找到最小值,交换                temp = arr[i];                arr[i] = arr[min];                arr[min] = temp;            }        }    }}

3、测试:

public class TestMain {    public static void main(String[] args) {        int array[] = { 5, 1, -1, 0, 3 };        SelectSort s = new SelectSort();        s.selectSort(array);        // 输出最后结果        for (int i = 0; i < array.length; i++) {            System.out.print(array[i] + " ");        }    }}

输出结果:
-1 0 1 3 5

4、算法分析

输入元素序列为:int array[] = { 5, 1, -1, 0, 3 },按从小到大的序列排序。

(1)、外层for循环从0开始,,当i=0时,min开始=0,arr[min]=arr[0]=5;j=i+1=1;arr[j]=1;所以arr[min]>arr[j]条件成立执行min=j=1;继续循环内层循环j++;所以此时j=2;所以arr[j]=-1;min=1;所以(arr[min]=1)>(arr[j]=-1)条件成立执行min=j=2;继续执行内层循环j++;所以此时j=3;所以arr[j]=0;min=2;所以(arr[min]=arr[2]=-1)>(arr[j]=arr[3]=0)条件不成了,所以min依然等于2;执行内层循环j++,所以此时j=4;所以arr[j]=3;min=2;所以(arr[min]=arr[2]=-1)>(arr[j]=arr[4]=3)条件不成立了,所以min依然等于2,此时内层循环执行完毕,继续执行后面的代码,(i != min)条件成立,所以把arr[min]=arr[2]=-1交换到无序列表的第一个位置即5的位置,此时输出为:-1 1 5 0 3

(2)、第一步的结果-1 1 5 0 3中-1为有序区,1 5 0 3为无序区,根据选择排序的思想我们要做的就是从无序区1 5 0 3中选出关键字最小的记录与无序区中的第一个记录交换位置即0和1交换位置。
外层for循环继续执行,i=1时,min开始=1,arr[min]=arr[1]=1;j=i+1=2;arr[j]=5;所以arr[min]>arr[j]条件不成立,继续循环内层循环j++;所以此时j=3;所以arr[j]=0;min=1;所以(arr[min]=1)>(arr[j]=0)条件成立执行min=j=3;继续执行内层循环j++;所以此时j=4;所以arr[j]=3;min=3;所以(arr[min]=arr[1]=1)>(arr[j]=arr[4]=0)条件不成了,所以min依然等于2;执行内层循环j++,所以此时j=4;所以arr[j]=3;min=2;所以(arr[min]=arr[2]=-1)>(arr[j]=arr[4]=3)条件不成了,此时内层循环执行完毕,继续执行后面的代码,(i != min)条件成立,所以把arr[min]=arr[3]=0交换到无序列表的第一个位置即1的位置,此时输出为:-1 0 5 1 3

(3)、第二步的结果-1 0 5 1 3中-1 0为有序区,5 1 3为无序区,根据选择排序的思想我们要做的就是从无序区5 1 3中选出关键字最小的记录与无序区中的第一个记录交换位置即1和5交换位置。
外层for循环继续执行,i=2时,min开始=2,arr[min]=arr[2]=5;j=i+1=2+1=3;arr[j]=1;所以arr[min]>arr[j]条件成立,所以min=j=3;继续循环内层循环j++;所以此时j=4;所以arr[j]=arr[4]=3;min=3;所以(arr[min]=1)>(arr[j]=3)条件不,此时内层循环执行完毕,继续执行后面的代码,(i != min)条件成立,所以把arr[min]=arr[3]=1交换到无序列表的第一个位置即5的位置,此时输出为:-1 0 1 3 5

(4)、第三步的结果-1 0 1 3 5,此时整个数组已经完全有序,但还是会循环。
外层for循环继续执行,i=3时,min开始=3,arr[min]=arr[3]=3;j=i+1=3+1=4;arr[j]=5;所以arr[min]>arr[j]条件不成立,同时内层循环也结束;继续执行后面的代码,(i != min)条件不成立,所以不进行交换,此时输出为:-1 0 1 3 5

(5)、第三步的结果-1 0 1 3 5,此时整个数组已经完全有序,但还是会循环。
外层for循环继续执行,i=4时,min开始=4,arr[min]=arr[4]=5;j=i+1=4+1=5;所以(j=5 )< (arr.length=5)条件不成立,所以不进行内层循环;继续执行后面的代码,(i != min)条件不成立,所以不进行交换,此时输出为:-1 0 1 3 5

5、 效率分析

这里写图片描述

6、常用排序方法比较

这里写图片描述

这里写图片描述