直接选择排序算法

转载 2016年08月31日 11:16:27

直接选择排序算法思想

无序数组a[0…n-1],第一次从a[0]~a[n-1]中选取最小值,与a[0]交换,第二次从a[1]~a[n-1]中选取最小值,与a[1]交换,….,第i次从a[i-1]~a[n-1]中选取最小值,与a[i-1]交换,…..,第n-1次从a[n-2]~a[n-1]中选取最小值,与a[n-2]交换,总共通过n-1次,得到一个按关键字从小到大排列的有序序列·

直接选择排序算法过程如下:

给定n=7,数组a中的7个元素为[8,3,2,1,7,4,6]

  • 初始状态 [ 8 3 2 1 7 4 6]

  • 第1次,数组a[0..6]中最小的数为a[3]=1,交换a[3]<->a[0],交换结果[ 1 3 2 8 7 4 6]

  • 第2次,数组a[1..6]中最小的数为a[2]=2,交换a[2]<->a[1],交换结果[ 1 2 3 8 7 4 6]

  • 第3次,数组a[2..6]中最小的数为a[2]=3,交换a[2]<->a[2],交换结果[ 1 2 3 8 7 4 6]

  • 第4次,数组a[3..6]中最小的数为a[5]=4,交换a[5]<->a[3],交换结果[ 1 2 3 4 6 8 7]

  • 第5次,数组a[4..6]中最小的数为a[4]=6,交换a[4]<->a[4],交换结果[ 1 2 3 4 6 8 7]

  • 第6次,数组a[5..6]中最小的数为a[6]=7,交换a[6]<->a[5],交换结果[ 1 2 3 4 6 7 8]

排序完成。


在直接选择排序中,共需要进行n-1次选择和交换,每次选择需要进行 n-i 次比较 (1<=i<=n-1),而每次交换最多需要3次移动,因此,总的比较次数C=(n*n - n)/2,时间复杂度O(n^2)。直接选择排序为原地排序,空间复杂度O(1)。直接选择排序不是稳定的排序算法。

算法实现

直接选择排序算法伪代码

//直接排序
SELECTION_SORT(A)
{
  for i=1 to n-1
      min=i
      for j=i+1 to n
          if A[min] > A[j]
             min = j
      swap A[min] <-> A[i]
}

Test

用直接选择排序算法对数组arr[10] = {8, 5, 10, 12, 7, 6, 15, 9, 11, 3}从小到大排序。

    @Test
    public void sort3() {
        Integer arr[] = { 8, 5, 10, 12, 7, 6, 15, 9, 11, 3 };
        for (int i = 0; i < arr.length; i++) {
            int temp = arr[i];
            int min = arr[i];
            int key = i;
            for (int j = i; j < arr.length; j++) {
                key = arr[j] < min ? j : key;
                min = arr[j] < min ? arr[j] : min;
            }
            if (key != i) {
                arr[i] = arr[key];
                arr[key] = temp;
            }
        }
        // 输出数组元素
        for (Integer it : arr) {
            System.out.print(it + "   ");
        }
    }

输出

3   5   6   7   8   9   10   11   12   15   

排序算法之直接选择排序

直接选择排序     直接选择排序是将整个待排序序列分为两部分,一部分为有序(最开始有序序列为空),一部分为无序(最终无序序列为空)。有序序列中的数都不大于无序序列中的数。它的过程是每次都在无序中寻找...
  • u010647471
  • u010647471
  • 2015-10-28 15:58:06
  • 254

走进数据结构之排序(五)---直接选择排序

一、直接选择排序算法分析 第一趟从n个元素的数据序列中选出关键字最小/大的元素并放到最前/后位置,下一趟再从n-1个元素中选出最小/大的元素并放到次前/后位置,以此类推,经过n-1趟完成排序。 二...
  • eininotop
  • eininotop
  • 2017-05-06 00:07:31
  • 337

用Python实现八大排序算法--直接选择排序

一、选择排序概述选择排序(Selection sort)是一种简单直观的排序算法,它的工作原理是每次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,知道全部待排序的数据元素排完...
  • chibangyuxun
  • chibangyuxun
  • 2016-11-02 11:38:09
  • 1627

用JAVA实现排序算法之三:直接选择排序

    本篇文章介绍直接选择排序算法的JAVA实现。    直接选择排序算法的基本思想是:n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:        ①初始状态:无序区为R[1...
  • huangxinfeng
  • huangxinfeng
  • 2010-11-22 14:45:00
  • 3632

C++排序之直接选择排序法

直接选择排序算法是一种简单直观的排序算法。它首先在未排序序列中找到最小(大)元素,存放到排序序列的其起始位置,然后再从剩余未排序的序列元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,...
  • lycx1234
  • lycx1234
  • 2017-02-06 14:54:38
  • 2142

排序算法六:选择排序之直接选择排序

排序算法六:选择排序声明:引用请注明出处http://blog.csdn.net/lg1259156776/引言在我的博文《“主宰世界”的10种算法短评》中给出的首个算法就是高效的排序算法。本文将对排...
  • LG1259156776
  • LG1259156776
  • 2015-09-26 10:24:35
  • 3355

排序算法Java实现——选择排序(直接选择排序)

基本思想:n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果 第一次比较:程序将记录定位在数组的第一个位置,拿第一个数据与后面的每个数据对比,用一个变量mix记录比第一个数小的数据的索...
  • singit
  • singit
  • 2017-04-22 22:30:12
  • 1824

排序算法---直接选择排序算法

选择排序算法的过程: 从所有序列中先找到最小的,然后放到第一个位置。之后再看剩余元素中最小的,放到第二个位置……以此类推,就可以完成整个的排序工作了。可以很清楚的发现,选择排序是固定位置,找元素。寻...
  • a1b2c3d4123456
  • a1b2c3d4123456
  • 2016-03-04 10:57:55
  • 384

java核心技术之直接选择排序算法

基本思想直接选择排序是选择排序的一种,其排序速度比冒泡排序要快一些,是常用的排序算法之一。 其基本思想是的将指定排序位置与其他数组元素分别比较,如果满足条件就交换元素值。注意,这里与冒泡排序的区别是...
  • hfreeman2008
  • hfreeman2008
  • 2016-11-23 21:42:38
  • 679

数据结构例程——选择排序之直接选择排序

本文是[数据结构基础系列(9):排序]中第6课时[选择排序之直接选择排序]的例程。#include #define MaxSize 20 typedef int KeyType; //定义关键...
  • sxhelijian
  • sxhelijian
  • 2015-11-30 15:40:15
  • 2302
收藏助手
不良信息举报
您举报文章:直接选择排序算法
举报原因:
原因补充:

(最多只允许输入30个字)