每天一算法 -- (选择排序)

Posted 听歌敲代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每天一算法 -- (选择排序)相关的知识,希望对你有一定的参考价值。

一、原理

  每一趟从待排序的数中,选出最小的元素,并将 最小的元素 换到 趟数 对应的位置上。 

二、思路

 1.假设有一个数组为 [n个数],第一趟先选出 最小的元素 min[k],将min[k]位置 和 第一个元素的位置 互换,此时第一个元素就是 最小的元素 min[k];由于第一趟已经选出最小的元素,也就是第二趟中就从第二个元素比较,选出除了第一个的最小元素min[j],然后和 第二个元素互换,此时 第二小的 元素 也排好序了,后面的也就一样的。 

 2.举例说明:数组 [5,3,2,8,1,4]

  第一趟:选出最小元素:1,将1和5 的位置互换,即

      1,3,2,8,5,4 

  ------------------------------------------------------------------------

  第二趟:除了第一个元素,选出最小元素:2,将2和3的位置互换,即:

      1,2,3,8,5,4

  ------------------------------------------------------------------------

  第三趟:除了第一二个元素,选出最小元素:3,将 3和3的位置互换,即:

      1,2,3,8,5,4

  ------------------------------------------------------------------------

  第四趟:除了第一二三个元素:选出最小元素:4,将4和8的位置互换,即:

      1,2,3,4,5,8

  ------------------------------------------------------------------------

  第五趟:除了第一二三四个元素:选出最小元素:5,将5和5的位置互换,即:

      1,2,3,4,5,8

  ------------------------------------------------------------------------

  此时,原来的数据 已经按照从小到大的顺序排列好了。

三、时间复杂度

  选择排序改进了冒泡排序,将必要的交互次数从O(n2)减少到O(n),但比较次数依然是O(n2)。选择排序仍然为大计数量的排序提出了一个非常大的改进,因为这些大量的记录会在内存中移动,这就是使交换的时间和比较的时间比起来,交换的时间更为重要。

  选择排序和冒泡排序执行了相同的比较次数,N(N-1)/2。对于10个数据项,需要进行45次比较,但 交换的次数却小于 10次;对于100个数据项,需要进行4500次比较,但 交换的次数却 小于100次。N值很大时,比较的次数是主要的。所以 选择排序 和 冒泡排序的时间复杂度都是 O(n2),但是,选择排序 无疑更快,因为它交换的次数少,

四、代码实现

 1 /**
 2  * 排序算法
 3  * @author Administrator
 4  */
 5 public class Sort {
 6 
 7     /**
 8      * 选择排序
 9      * @param numbers
10      */
11     public static void selectSort(int[] numbers) {
12         int min = 0;   // 定义最小变量
13         int temp = 0;   // 定义中间变量
14         
15         for(int i = 0; i < numbers.length - 1 ; i++){     // 第i趟
16             min = i;
17             for(int j = i + 1; j < numbers.length; j ++){    // 找出最小元素    
18                 if(numbers[j] < numbers[min]){
19                     min = j;
20                 }
21             }
22             temp = numbers[i];
23             numbers[i] = numbers[min];
24             numbers[min] = temp;
25         }
26         
27         for(int i = 0;i<numbers.length;i++){
28             System.out.print(numbers[i] + "  ");
29         }
30     }
31     
32     /**
33      * 测试
34      * @param args
35      */
36     public static void main(String[] args) {
37         int[] arr = {5,3,2,8,1,4};
38         selectSort(arr);
39     }
40 }

 

以上是关于每天一算法 -- (选择排序)的主要内容,如果未能解决你的问题,请参考以下文章

每天一算法 -- (冒泡排序算法)

每天一算法 -- (插入排序)

「鸡尾酒排序」不会?每天一遍,排序再见超详细

常见14种经典排序算法(Java代码实现)

每天一题 · Day1 · 快速排序[785]

每天一题LeetCode 26. 删除排序数组中的重复项