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

一、原理

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

二、思路

 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 }
时间: 2024-10-02 19:19:14

每天一算法 -- (选择排序)的相关文章

经典排序算法 - 选择排序Selection sort

经典排序算法 - 选择排序Selection sort 顾名思意,就是直接从待排序数组里选择一个最小(或最大)的数字,每次都拿一个最小数字出来, 顺序放入新数组,直到全部拿完 再简单点,对着一群数组说,你们谁最小出列,站到最后边 然后继续对剩余的无序数组说,你们谁最小出列,站到最后边 再继续刚才的操作,一直到最后一个,继续站到最后边,现在数组有序了,从小到大 举例 先说看每步的状态变化,后边介绍细节,现有无序数组[6 2 4 1 5 9] 第一趟找到最小数1,放到最前边(与首位数字交换) 交换前

白话排序算法--选择排序

前言: 继续排序方法,紧接早上的插入排序,紧跟其后,现在跟新上选择排序算法 选择排序:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 情景描述: 新学期换了新体育老师,面对同样的排队情景,他说道:“我不管之前是怎么教的,之后都按照我的来做,大家自己进行选择排序”. 从第一位同学开始,和第二位同学比较,谁矮了,谁就记着目前自己是最矮的(可以站前面,嘿嘿), 然后再和第三位

算法----选择排序(select sort)

选择排序就是每次将未排序的数组中最小的一个元素找出,将其与数组的第一个元素交换,从而完成数组的排序. 算法实现: void sort::select_sort(int* a,const int n) { for(int i=0 ;i<n; i++) { int min = i; for(int j=i+1; j<n; j++) { if(a[j] < a[min]) min = j; } swap(a,i,min); } } 上述算法可以看出,在选择排序的过程中只交换了N次数组元素.算法

排序算法--选择排序

# 选择排序##本小节知识点:1. [了解]选择排序2. [掌握]选择排序的基本思想3. [了解]练习 --- ##1.选择排序- 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元 素,然后放到排序序列末尾.以此类推,直到所有元素均排序完毕. --- ##2.选择排序的基本思想- 第一趟排序在所有待排序的n个记录中选出关键字最小的记录,将它与数据表中的第一个记录交

算法-选择排序

选择排序(Selection sort)是一种常见的排序算法,算法实现的逻辑每一次从待排序的数组中选出最小(或最大)的一个元素,存放在序列的第一个位置,然后生鲜的元素中选择第二小(或者第二大)的元素放在第二个位置,以此类推,将整个数组排序成功.对于一个长度为N的数组,选择排序大概需要N^2/2的比较和N次交换,运行的时间和输入无关,一个有序的数组和一个无序的数组最终运行的时间是一样的,数据移动的次数是最少的,交换数组的次数和数组的大小呈线性关系. 关键代码实现如下: -(NSMutableArr

经典排序算法——选择排序

对于一个int数组,请编写一个选择排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] class SelectionSort { public: int* selectionSort(int* A, int n){ // write code here int k=0; for(int i=0;i<n;++i) { k=i; for(int j=i+1;j<n;++j)//找到最小元素 {

排序算法——选择排序(js语言实现)

选择排序:顾名思义选择,选择排序属于O(N^2)的排序算法,意思就是选择数组中的最小的拿出来放在第一位,然后再剩下的数里面,选择最小的,排在第二位,以此类推. 例如:8  3  4  5  6  2  1  7 第一次:寻找数组中最小的数1,然后和8替换,得到 1 3 4 5 6 2 8 7 第二次:因为1的位置已经确定,所以只需要找剩下数组中最小的就行了,2和3互换得到1 2 4 5 6 3 8 7 第三次:1和2的位置已经确定,就看剩下的数中最小的数,3和4互换,结果是1 2 3 5 6 4

Java学习资料-Java常用算法-选择排序算法

ChooseSort源程序public class ChooseSort { private static void ChooseSort (int [] a){  for(int i = 0; i < a.length; i++){   //对数组循环,假设数据排在前面的元素总比后面的小,然后与后面的数据进行比较   int k = i;   for(int j = i+1; j <a.length; j++){//对数据遍历,寻找最小的数据元素的数组下标    if(a[j]<a[k

算法 排序算法--选择排序

选择排序是排序算法的一种,这里以从小到大排序为例进行讲解. 基本思想及举例说明 选择排序(从小到大)的基本思想是,首先,选出最小的数,放在第一个位置:然后,选出第二小的数,放在第二个位置:以此类推,直到所有的数从小到大排序. 在实现上,我们通常是先确定第i小的数所在的位置,然后,将其与第i个数进行交换. 下面,以对 3  2  4  1 进行选择排序说明排序过程,使用min_index 记录当前最小的数所在的位置. 第1轮 排序过程 (寻找第1小的数所在的位置)3  2  4  1(最初, mi

java基本算法选择排序和冒泡排序

1.冒泡排序 冒泡排序(Bubble Sort)是最经典也是最简单的排序算法之一. 原理:比较相邻的两个元素,将值大的元素交换到右边(降序则相反). 步骤:比较相邻的元素.如果第一个比第二个大,就交换他们两个.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.这步做完后,最后的元素会是最大的数. 针对所有的元素重复以上的步骤,除了最后一个.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较. package first; import java.util.Scanne