选择排序详解

选择排序

选择排序是最简单的排序方法之一,它的做法是这样的:首先,找出数组中最小的那个元素,将最小的元素与第一个元素的位置互换,然后找出数组中第二小的元素,与数组中第二个元素互换位置(如果要比较的元素是当前最小,则自己和自己交换),以此类推,直到遍历了整个数组。这种方法叫做选择排序,因为它会不断地选择剩余元素中的最小者。

表格1-1排序步骤
初始值: 1 10 -5 9 8 7 3
第一趟: -5 10 1 9 8 7 3
第二趟: -5 1 10 9 8 7 3
第三趟: -5 1 3 9 8 7 10
第四趟: -5 1 3 7 8 9 10
第五趟: -5 1 3 7 8 9 10
第六趟: -5 1 3 7 8 9 10
第七趟: -5 1 3 7 8 9 10

如表格1-1所示,红色代表已经排序好的序列,每次交换都能排定一个元素,因此交换的总次数是N,算法的运行时间和输入无关,因为内循环会进行(N-1)+(N-2)+……+1=N(N-1)/2~(N2/2)次比较,因此选择排序的时间复杂度为O(n2)

以下代码分别为C、Java、Python、Scala

  

算法1-2为选择排序的C语言实现

#include <stdio.h>

void selection_sort( int arr[], int len );

void selection_sort( int arr[], int len )
{
    int i = 0, j = 0, min = 0, temp = 0;
    for ( i = 0; i < len; i++ )
    {
        min = i;
        for ( j = min + 1; j < len; j++ )
        {
            if ( arr[min] > arr[j] )
            {
                min = j;
            }
        }
        temp        = arr[i];
        arr[i]        = arr[min];
        arr[min]    = temp;
    }
}

void main()
{
    int    i    = 0;
    int    arr[]    = { 1, 10, -5, 9, 8, 7, 3 };
    int    len    = sizeof(arr) / sizeof(arr[0]);
    printf( "待排序数组:" );
    for ( i = 0; i < len; i++ )
    {
        printf( "%d ", arr[i] );
    }
    printf( "\n" );
    selection_sort( arr, len );
    printf( "排序后数组:" );
    for ( i = 0; i < len; i++ )
    {
        printf( "%d ", arr[i] );
    }
}

  

算法1-3为选择排序的Java实现

import java.util.Arrays;

public class Selection {

    public static void selectionSort(int... arr) {
        for (int i = 0; i < arr.length; i++) {
            int min = i;
            for (int j = min + 1; j < arr.length; j++) {
                if (arr[min] > arr[j]) {
                    min = j;
                }
            }
            int temp = arr[i];
            arr[i] = arr[min];
            arr[min] = temp;
        }
    }

    public static void main(String[] args) {
        int[] arr = { 1, 10, -5, 9, 8, 7, 3 };
        System.out.print("待排序数组:" + Arrays.toString(arr));
        System.out.println();
        selectionSort(arr);
        System.out.println("排序后数组:" + Arrays.toString(arr));
    }

}

  

算法1-4为选择排序的Python实现

# coding:utf-8
def selection_sort(arr):
    for i in range(0, len(arr)):
        min = i
        for j in range(min + 1, len(arr)):
            if arr[min] > arr[j]: min = j
        temp = arr[i]
        arr[i] = arr[min]
        arr[min] = temp

arr = [1, 10, -5, 9, 8, 7, 3]
print "待排序数组:", arr
selection_sort(arr)
print "排序后数组", arr

  

算法1-5为选择排序的Scala实现

import java.util.Arrays

object Selection {

  def selectionSort(comparator: (Int, Int) => Boolean)(arr: Array[Int]) {
    for (i <- 0 until arr.length) {
      var min = i
      for (j <- min + 1 until arr.length) {
        if (comparator(arr(min), arr(j))) {
          min = j
        }
      }
      var temp = arr(i)
      arr(i) = arr(min)
      arr(min) = temp
    }
  }

  def main(args: Array[String]): Unit = {
    val arr = Array(1, 10, -5, 9, 8, 7, 3)
    println("待排序数组:" + Arrays.toString(arr))
    selectionSort(_ > _)(arr)
    println("排序后数组:" + Arrays.toString(arr))

  }

}
时间: 2024-10-14 00:39:21

选择排序详解的相关文章

C#选择排序详解

选择排序图解                         选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 选择排序的主要优点与数据移动有关.如果某个元素位于正确的最终位置上,则它不会被移动.选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总

【内部排序】 交换排序与选择排序详解

交换排序:通过依次交换逆序的元素使其有序化的过程. 介绍两种交换排序: 冒泡排序,快速排序 冒泡法:从第一个元素开始,依次比较相邻的两个元素,如果逆序则交换,第一趟比较结束后,序列中最大的元素将移动到序列末尾,即第n个位置,第二趟将次大元素移动到n-1位置-- 多趟比较后,会形成有序序列,排序方法类似气泡慢慢向上浮动,因此成为冒泡法. 快速排序: 对冒泡的改进,将序列中的关键字和指定元素(枢轴)比较,将序列以枢轴划分,保证枢轴大于其左边所有数,小于其右边所有数. (枢轴的选取很关键,避免快排在局

python的sorted排序详解

排序,在编程中经常遇到的算法,我也在几篇文章中介绍了一些关于排序的算法.有的高级语言内置了一些排序函数.本文讲述Python在这方面的工作.供使用python的程序员们参考,也让没有使用python的朋友了解python.领略一番"生命有限,请用Python"的含义. 内置函数sorted()/list.sort()的使用 简单应用 python对list有一个内置函数:sorted(),专门用于排序.举例: >>> a=[5,3,6,1,9,2] >>&

Excel2010排序详解

我倒是要看看这一天一篇的发表频率,能让我自己坚持多长时间. 今天跟大家分享的主要内容是在Excel中的筛选功能,这个功能应该是谁都用过,把一列数据按照从大到小,从小到大的,有意义或无意义的排列着.这个方法大家都会,用着几个按钮就都能搞定. 稍微复杂点的操作呢,比如按多关键字排序,按照单元格颜色排序,局部排序,按行横向排序,excel是如何完成的呢?耐心往下看. 1 按照多关键字排序.先看数据源,先按单据编号排序,在单据编号相同的情况下,按照商品编号排序,如果商品编号再相同,就按单据日期排序.这个

极角排序详解:

极角排序详解 名词释义: 在平面内取一个定点O,叫极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向).对于平面内任何一点M,用ρ表示线段OM的长度(有时也用r表示),θ表示从Ox到OM的角度,ρ叫做点M的极径,θ叫做点M的极角,有序数对 (ρ,θ)就叫点M的极坐标 四种极角排序代码详解: 1 struct point 2 { 3 double x,y; 4 }; 5 6 double cross(double x1,double y1,double x2,dou

选择排序算法(排序详解)

直接插入排序(Selection Sort)算法 1.基本思想: 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完. 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面). n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果: ①初始状态:无序区为R[1..n],有序区为空.

数据结构与算法分析之----各种常用排序详解

1.选择排序 思想:在需要进行排序的序列中,每次把最小(或最大)的交换到最左边的位置 案例: 待排序数组: 5 2 6 8 4 1 选择过程:    5 2 6 8 4 1 => 2 5 6 8 4 1 => 1 5 6 8 4 2 => 1 4 6 8 5 2 => 1 2 6 8 5 4 => 1 2 5 8 6 4 => 1 2 4 8 6 5... 2.冒泡排序 思想:在需要进行排序的序列中,每次把最小(或最大)的推到最顶端,像气泡一样往上冒 案例: 待排序

排序详解(希尔,快排,归并等)

今天集中把几种排序的方法列一下,当然最出名的希尔,快排,归并和其优化当然也是满载 说到希尔排序的话,不得不先提到的就是插入排序了,希尔排序就是对直接插入排序的一种优化,下面就是直接插入排序的思想 1 void InsertSort(int *a, size_t size) 2 { 3 assert(a); 4 for (int i = 1; i < size; ++i) 5 { 6 int index = i; 7 int tmp = a[index]; 8 int end = index -

图论-拓扑排序详解

拓扑排序(topsort)详解 这篇随笔就信息学奥林匹克竞赛中图论的一个知识点--拓扑排序进行讲解.拓扑排序的内容比较基础,只要求读者学习过并了解信息学中图的相关定义和一些专业名词,但是拓扑排序的变形题目比较多,希望读者在看完本随笔后认真体会练习,掌握拓扑排序. 上课! 拓扑排序的定义 顾名思义,这是一种排序,确切地说,是一种图上排序,在一张有向无环图(注解:有向无环图即很多参考书和题解中所说的DAG)上进行排序,把其中的所有节点排成一个序列,使得图中的任意一对有边相连的节点(u,v)u要出现在