码迷,mamicode.com
首页 > 编程语言 > 详细

简单选择排序

时间:2015-09-22 14:31:13      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:

1.原理

待排序数组:[a1,a2,a3....an],通过n-i次关键字之间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录进行交换,当i等于n时所有记录有序排列。

2.实例

待排序数组:[3,4,1,5,2]

注:k用于存储元素的下标,元素进行两两比较时,没有进行多次换位,而是将较小元素的下标存于k中,当所有未排序的元素进行比较后,k即是最小元素的下标。

第一次外排序:                          第二次外排序:                         第三次外排序:                           第四次外排序:

k=0                                        k=1                                       k=2                                         k=3

3<4   no----k=0;                     4>3   yes---k=2;                    3<5   no----k=2;                      5>4   yes----k=4;

3>1   yes---k=2;                     3<5   no----k=2;                    3<4   no----k=2;                      换值:

1<5   no----k=2;                     3>2   yes---k=4;                    此时k的值未变,不需要                 a3=4,a4=5

1<2   no----k=2;                     换值:                                    换值。                                      变换后:

换值:                                      a1=2,a4=4;                                                                        [1,2,3,4,5]

a0=1,a2=3;                           变换后:

变换后:                                   [1,2,3,5,4]

[1,4,3,5,2]

3.时间复杂度

在最好的情况下,交换0次,比较(n-1)n/2次,时间复杂度为O(n^2)。

在最坏的情况下,交换3n(n-1)/2次,比较n(n-1)/2次,时间复杂度为O(n^2)。

注:简单选择排序看似和冒泡排序的时间复杂度虽然相同,但是它的性能优于冒泡排序,原因如下:冒泡排序进行关键字的比较时,可能会交换两个记录的值,而简单选择排序只需将最小记录和被比较记录进行交换。即每次外排序时,简单选择排序交换值的次数不大于1,冒泡排序大于等于0。

4.代码

public class SelectSortTest {

             //遍历数组
    public static void Paixu(int a[]){
        for(int i=0;i<a.length;i++){
            System.out.print(a[i]+" ");
        }

      System.out.print();
    }

         //简单选择排序
    public static void Test(int a[]){
        for(int i=0;i<a.length-1;i++){                   //共计n-1次外排序
            int k=i;                                             //设k的初始值为i
            for(int j=i+1;j<a.length;j++){           
                if(a[k]>a[j]){                           //ak和后面的元素比较,符合要求则令k=j,直至找到最小元素下标     
                    k=j;
                }
            }
            if(k!=i){                          //当最小元素下标发生变化时,将两记录换值
                int temp=a[i];
                a[i]=a[k];
                a[k]=temp;
            }

             SelectSortTest.Paixu(a);
        }
    }
    public static void main(String args[]){
        int a[]={3,5,1,4,2};
        SelectSortTest.Test(a);
    }
}
技术分享

 

简单选择排序

标签:

原文地址:http://www.cnblogs.com/jfl-xx/p/4825251.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!