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

算法简介

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

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

白话理解

  依然已排队为例,在排队时,有的老师可能会选择这样排序,先在一列中选出最矮的,放在第一位,然后选出第二矮的,放在第二位。队伍完成排序。而这就是选择排序的思想。

简单排序处理流程

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

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

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

Java代码实现:

 1 package sortDemo;
 2
 3 /**
 4  * 插入代码实现
 5  * @author xianyu
 6  * @CreatTime 下午8:16:11
 7  */
 8 public class SelectionDemo {
 9
10     public static void main(String[] args) {
11         int[] sort ={3,2,1,4,6,5,8,9,10,7} ;
12         System.out.println("排序前:");
13         print(sort);
14         selectionDemo(sort);
15         System.out.println("\n排序后:");
16         print(sort);
17     }
18
19     public static void selectionDemo(int[] a){
20         for (int i = 0; i < a.length; i++) {
21             for (int j = i+1; j < a.length; j++) {
22                 if(a[j]<a[i]){
23                     int tmp = a[j];
24                     a[j] = a[i];
25                     a[i]=tmp;
26                 }
27             }
28         }
29     }
30
31     public static void print(int[] a){
32         for (int i = 0; i < a.length; i++) {
33             System.out.print(a[i]+" ");
34         }
35     }
36 }

算法分析:

时间复杂度

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

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

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

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

空间复杂度

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

由交换条件,a[j+1]<a[i]可以判断出,相同的值并不会交换。所以简单选择排序是稳定排序。

简单选择排序的改进——二元选择排序

简单选择排序,每趟循环只能确定一个元素排序后的定位。我们可以考虑改进为每趟循环确定两个元素(当前趟最大和最小记录)的位置,从而减少排序所需的循环次数。改进后对n个数据进行排序,最多只需进行[n/2]趟循环即可。具体实现如下:

 1 static void selectSort(int[] r) {
 2         int n = r.length;
 3         int i ,j , min ,max, tmp;
 4         for (i=0 ;i <= n/2;i++) {
 5             // 做不超过n/2趟选择排序
 6             min = i; max = i ; //分别记录最大和最小关键字记录位置
 7             for (j= i+1; j<= n-1-i; j++) {
 8                 if (r[j] > r[max]) {
 9                     max = j ; continue ;
10                 }
11                 if (r[j]< r[min]) {
12                     min = j ;
13                 }
14           }
15           //该交换操作还可分情况讨论以提高效率
16           tmp = r[i]; r[i] = r[min]; r[min] = tmp;
17           tmp = r[n-1-i]; r[n-1-i] = r[max]; r[max] = tmp;
18         }
19     }  
时间: 2024-10-08 09:30:10

经典排序算法--简单选择排序的相关文章

C语言排序算法——简单选择排序算法

冒泡排序算法的思想是不断的交换,通过交换完成最终的排序. 选择排序的基本思想是每一趟在n-i+1个记录中选取最小的记录,作为第i个的记录. 1 void SimpleSelectSort(int *p) 2 { 3 int i,j,min; 4 for(i=0;i<10;i++) 5 { 6 min=i;    //将当前下标定义为最小下标 7 for(j=i+1;j<10;j++) 8 { 9 if(p[min>p[j]])    //如果有小于当前最小值的 10 { 11 min=j

数据结构排序算法之选择排序

今天继续介绍一种排序算法:选择排序. 选择排序的基本思想就是从待排序列中选择出最小的,然后将被选出元素和序列的第一个元素互换位置(当前默认是升序排列),则互换完成后第一个元素就是整个序列的最小的元素,则一次选择排序结束.然后我们从剩下的子序列中选择出最小的,然后将该被选出来的元素和该子序列的第一个元素(即整个序列的第二个元素)互换位置,则当前整个序列的第二个元素就是当前序列中的次最小值,第二次选择排序结束.以此类推,直到该待排序列只剩下一个元素后,则整个序列有序. 具体过程如下图所示: 下面就不

【排序算法】选择排序(Selection sort)

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

排序算法之选择排序

一. 算法描述 选择排序:在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换......第N-1趟遍历剩下的2个数据,找出其中最小的数值与第N-1个元素交换,至此选择排序完成. 二. 算法分析 平均时间复杂度:O(n2) 空间复杂度:O(1)  (用于交换和记录索引) 稳定性:不稳定 (比如序列[5, 5, 3]第一趟就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面) 三. 算法实现

初级排序算法之选择排序

初级排序算法 本质是对要排序的数组进行嵌套循环,内层循环负责局部的排序,外层循环负责剩余的无序元素的递减.所以你只要理解嵌套循环和比较大小就能很快的掌握初级排序算法. 选择排序 一个无序的数组 a = [0, 4, 6, 3, 8, 2, 3, 9], 你也可以把a的元素想象成任何现实中可比较的具体物体.例如,有10根长短不一的木条,我们如何对它们进行排序?一个最直接的思想,先拿出最短的放到最前面,在剩余的木条中再拿出最短的放在第二位...直到最后一根木条.从中我们可以看出,1. 我们需要再一次

【排序算法】选择排序

选择排序算法原理 选择排序算法时间复杂度分析 选择排序算法稳定性分析 选择排序算法C语言代码 #include <stdio.h> //交换两个元素的值 void swap(int* a, int* b) { int temp; temp = *a; *a = *b; *b = temp; } void selectionSort(int arr[], int length) { int i, j, maxIndex; for(i = length; i > 0; i--) { //假设

八大排序算法之三选择排序—简单选择排序(Simple Selection Sort)

基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止. 简单选择排序的示例: 操作方法: 第一趟,从n 个记录中找出关键码最小的记录与第一个记录交换: 第二趟,从第二个记录开始的n-1 个记录中再选出关键码最小的记录与第二个记录交换: 以此类推..... 第i 趟,则从第i 个记录开始的n-i+1 个记录中选出关键码最小的记录与

4.3_8种常用排序算法3(选择排序:简单选择排序+堆排序)

[简单选择排序] package com.sort.demo3; import java.util.Arrays; /** * 简单选择排序 */ public class SelectSort { public static void main(String[] args) { int[] arr = new int[]{1,4,5,7,3,9,8,0,2,6}; System.out.println(Arrays.toString(arr)); selectSort(arr); System

排序——直接选择排序(简单选择排序)

直接选择排序也称简单选择排序,是一种相对简单的排序算法,它的基本思想是:从一列数中找出最小的,和第一个交换:剩下的重新找出最小的,和这列数的第二个交换,......一直进行n-1次比较之后,该数列已经为有序数列了. 例如:已知一组无序数列:6 3 5 1 4 2 9 第一次:[6 3 5 1 4 2 9] 最小数为:1 第二次:1 [3 5 6 4 2 9] 最小数为:2 第三次:1 2 [5 6 4 3 9] 最小数为:3 第四次:1 2 3 [6 4 5 9] 最小数为:4 第五次:1 2