关闭

简单选择排序

106人阅读 评论(0) 收藏 举报

简单选择排序是一种选择排序。

选择排序:每趟从待排序的记录中选出关键字最小的记录,顺序放在已排序的记录序列末尾,直到全部排序结束为止。
这里写图片描述

简单排序处理流程

(1) 从待排序序列中,找到关键字最小的元素;

(2) 如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换;

(3) 从余下的 N - 1 个元素中,找出关键字最小的元素,重复(1)、(2)步,直到排序结束。

如图所示,每趟排序中,将当前第 i 小的元素放在位置 i 上。
核心代码

public void selectionSort(int[] arr) {
    // 需要遍历获得最小值的次数
    // 要注意一点,当要排序 N 个数,已经经过 N-1 次遍历后,已经是有序数列
    for (int i = 0; i < arr.length - 1; i++) {
        int temp = 0;
        int min= i; // 用来保存最小值得索引

        // 寻找第i个小的数值
        for (int j = i + 1; j < arr.length; j++) {
            if (arr[min] > arr[j]) {
                min = j;
            }
        }

        // 将找到的第i个小的数值放在第i个位置上
        temp = arr[min];
        arr[min] = arr[i];
        arr[i] = temp;

        System.out.format("第 %d 趟:\t", i + 1);
        printAll(arr);
    }
}

算法分析

简单选择排序算法的性能
这里写图片描述
时间复杂度

简单选择排序的比较次数与序列的初始排序无关。 假设待排序的序列有 N 个元素,则比较次数总是N (N - 1) / 2。

而移动次数与序列的初始排序有关。当序列正序时,移动次数最少,为 0.

当序列反序时,移动次数最多,为3N (N - 1) / 2。

所以,综合以上,简单排序的时间复杂度为 O(N2)。

空间复杂度

简单选择排序需要占用 1 个临时空间,在交换数值时使用。

运行结果
排序前: 3 5 2 8 1 2 0 8 4 1
第 1 趟: 0 5 2 8 1 2 3 8 4 1
第 2 趟: 0 1 2 8 5 2 3 8 4 1
第 3 趟: 0 1 1 8 5 2 3 8 4 2
第 4 趟: 0 1 1 2 5 8 3 8 4 2
第 5 趟: 0 1 1 2 2 8 3 8 4 5
第 6 趟: 0 1 1 2 2 3 8 8 4 5
第 7 趟: 0 1 1 2 2 3 4 8 8 5
第 8 趟: 0 1 1 2 2 3 4 5 8 8
第 9 趟: 0 1 1 2 2 3 4 5 8 8
排序后: 0 1 1 2 2 3 4 5 8 8

0
0
查看评论

选择排序——简单选择排序和堆排序,C++代码实现

<br />#include <iostream> using namespace std; typedef struct { int r[100+1]; int length; }SqList; //简单选择排序 void SimpleSlectSort...
  • hackerain
  • hackerain
  • 2011-01-07 16:57
  • 2525

经典排序算法之简单选择排序

前面在介绍冒泡排序的时候,有提到一种简单排序算法,就是从0开始,每次确定一个位置的元素。假设当前需要确定的位置下标为 i,则将i处的元素与后面的元素逐个比较,并将每次比较结果中较小的元素存放在i处,从而保证i处一直保存着最小元素。 简单的选择排序算法与这种算法思路一样,但是选择排序在比较...
  • hulifangjiayou
  • hulifangjiayou
  • 2015-08-06 19:19
  • 6448

数据结构与算法之排序算法---简单选择排序

数据结构与算法之排序算法—简单选择排序 简单选择排序的基本思想 完整实现代码 复杂度分析 2016年10月18日15:54:57 by:piaxiaohui简单排序的基本思想 简单选择排序:先选择一个关键字,然后进行比较,找到合适的关键字再做交换,并且只移动一次。冒泡排...
  • u010548437
  • u010548437
  • 2016-10-18 16:28
  • 1011

C++ 简单选择排序

基本思想:第i趟在n-i+1(i=1,2,....,n-1)个记录中选取关键码最小的记录作为有序序列的第i个记录。 需要解决的问题? (1)如何在待排序序列中选出关键码最小的记录? (2)如何确定待排序序列中最小的记录在有序序列中的位置? 简单选择排序实质是一种交换排序,从待排序序列中选取最...
  • fu_zk
  • fu_zk
  • 2012-12-13 13:30
  • 4068

简单选择排序--Java实现

package com.shusheng.selectMethod;/** * 简单选择排序 * @author Administrator * */ public class SelectMethod { /** * 简单选择排序 * 原理:从i到args.len...
  • Petershusheng
  • Petershusheng
  • 2016-03-11 12:18
  • 1938

算法---简单选择排序法

void selectsort(int a[],int n) {         int i,j,t,k;         for(i=0;i  &#...
  • yinhua405
  • yinhua405
  • 2017-05-02 15:22
  • 179

C语言 简单选择排序算法

选择排序是排序算法的一种,这里以从小到大排序为例进行讲解。 基本思想及举例说明 选择排序(从小到大)的基本思想是,首先,选出最小的数,放在第一个位置;然后,选出第二小的数,放在第二个位置;以此类推,直到所有的数从小到大排序。 在实现上,我们通常是先确定第i小的数所在的位置,然后,将其与第i...
  • u010173075
  • u010173075
  • 2014-08-27 21:31
  • 3186

简单选择排序(C语言实现)

简单选择排序也称直接选择排序,基本思想如下: 对于一组关键字{K1,K2,…,Kn}, 首先从K1,K2,…,Kn中选择最小值,假如它是 Kz,则将Kz与 K1对换;然后从K2,K3,… ,Kn中选择最小值 Kz,再将Kz与K2对换。如此进行选择和调换n-2趟,第(n-1)趟,从Kn-1、Kn中选...
  • vicious_net
  • vicious_net
  • 2013-01-28 20:32
  • 2272

C语言简单选择排序算法的实现

简单选择排序从元素中跳出最小关键字,将其放在已排序列的最后,未排序的序列最前,直到全部排序完成为止,其空间复杂度为O(1),时间复杂度为O(n2)。下面是实现代码: 首先仍然是预定义和类型定义: #define OK 1 #define ERROR 0 typedef int Status; ...
  • ZGUIZ
  • ZGUIZ
  • 2017-01-25 12:34
  • 1005

五、排序算法之简单算法——冒泡排序、简单选择排序和直接插入排序

废话不多说,先来个笑话(声明笑话转载): 最近的国际局势就像这样,美帝喊:有种放学别走! 乌克兰大叫:老子喊人揍死你。 欧盟嚷嚷道:下课就动手!! 普大帝冷冷的说:放学了啊,到底打不打我呀,不打我走了。 进入正题,学算法不可能不提排序,排序算法主要分为:简单算法和改进算法,前者主要有冒泡排序、简...
  • kukutengteng
  • kukutengteng
  • 2014-03-22 15:53
  • 757
    个人资料
    • 访问:59394次
    • 积分:1227
    • 等级:
    • 排名:千里之外
    • 原创:54篇
    • 转载:69篇
    • 译文:0篇
    • 评论:10条
    最新评论