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

直接选择排序也称简单选择排序,是一种相对简单的排序算法,它的基本思想是:从一列数中找出最小的,和第一个交换;剩下的重新找出最小的,和这列数的第二个交换,......一直进行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 3 4 [6 5 9] 最小数为:5

第六次:1 2 3 4 5 [6 9] 最小数为:6

第七次:1 2 3 4 5 6 [9] 已经为有序数列了。

代码实现(Java语言):

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Scanner;

public class Main{
//    public final static double pi = 3.1415927;
    public static void main(String[] args) {

        Scanner sin=new Scanner(System.in);
        while(sin.hasNextInt()){
            int len = sin.nextInt();//输入数组的长度
            int array[] = new int[100];
            for(int i=0; i<len; i++){
                array[i] = sin.nextInt();//以此输入无序数组
            }
            S_sort(array, len);//直接插入排序
            display(array, len);//显示排序之后的有序数列
        }
    }
    public static void display(int array[],int len){

        for(int i=0; i<len; i++){
            System.out.print(array[i]+" ");
        }
    }
    public static void S_sort(int array[],int len){
        for(int i=0; i<len; i++){
            int min = i;
            for(int j=i+1; j<len; j++){
                if(array[j]<array[min]){
                    min = j;
                }
            }
            int temp = array[min];
            array[min] = array[i];
            array[i] = temp;
        }
    }

}

效率分析:

在直接选择排序中,共需要进行n-1次选择和交换,每次选择需要进行 n-i 次比较 (1<=i<=n-1),而每次交换最多需要3次移动,因此,总的比较次数C=(n*n - n)/2,

总的移动次数 3(n-1).由此可知,直接选择排序的时间复杂度为 O(n^2) ,这就意味值在n比较小的情况下,选择排序算法可以保证一定的速度,但当n足够大时,算法的效率会降低。所以使用时要注意所以当记录占用字节数较多时,通常比直接插入排序的执行速度快些。

由于在直接选择排序中存在着不相邻元素之间的互换,因此,直接选择排序是一种不稳定的排序方法。

时间: 2024-10-20 16:38:45

排序——直接选择排序(简单选择排序)的相关文章

常见排序算法导读(3)[简单选择排序]

这一节将介绍简单选择排序(Simple Selection Sort). 在介绍简单排序算法之前,先给出排序的确切定义,并简单介绍一下排序算法的稳定性. 排序的确切定义 假设含有n个对象的序列为{R[0], R[1], ..., R[n-1]}, 其对应的关键字(key)序列为{K[0], K[1], ..., K[n-1]}. 所谓排序, 就是确定0, 1, ..., n-1的一种排列p[0], p[1], ..., p[n-1], 使各个关键字满足如下的非递减(升序)或非递增(降序)关系:

直接插入排序、二分插入排序、希尔排序、冒泡排序与简单选择排序

一.直接插入排序 稳定,时间复杂度:最好O(n).最差O(n^2).平均O(n^2),空间复杂度O(1) void InsertSort(int L[], int n) { int i, j,key; for (i = 1; i<n; i++) if(L[i] < L[i-1])//需要将L[i]插入到有序表L[0...i-1] { key = L[i]; for(j = i-1; j >= 0 && key < L[j]; j--)//后移 L[j+1] = L[

七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)

 写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列.因此排序掌握各种排序算法非常重要.对下面介绍的各个排序,我们假定所有排序的关键字都是整数.对传入函数的参数默认是已经检查好了的.只是简单的描述各个算法并给出了具体实现代码,并未做其他深究探讨. 基础知识: 由于待排序的记录数量不同,使得排序过程中设计的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是待排序记录存放在计算机随机存储器中进行的排序过程.另一类是外部排序,

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

简单选择排序,就是执行n-i次比较,然后从n-i+1个数据中选择最小的值,如果最小值不是第i(1=<i<=n)个,则和第i个交换. 1 <?php 2 $arr = array(9,5,4,8,7,6,0,3,2,1); 3 4 /** 5 * 返回经过简单选择排序算法排序后的数组 6 * @param $array array 要进行排序的数组 7 * return array 进过排序后的数组 8 */ 9 function SelectSort($array){ 10 11 for

Java排序算法(二):简单选择排序

[基本思想] 在要排序的一组数中.选出最小的一个数与第一个位置的数交换:然后在剩下的数中再找出最小的与第二个位置的数交换,如此循环至倒数第二个数和最后一个数比較为止. 算法关键:找到最小的那个数.并用变量记住它的下标. [java实现] public class SimpleSelectionSort { public static void main(String[] args) { int[] arr = { 9, 1, 5, 8, 3, 7, 4, 6, 2 }; System.out.p

(二)选择排序之二:简单选择排序

选择排序分为:简答选择排序.树形选择排序.堆排序,今天来学一下简答选择排序. 具体代码如下: package com.cust.heap; /** * * 描述:简单选择排序 * @author cookie */ public class 简单选择排序 { public static void main(String[] args) { int[] array = new int[]{2,5,6,9,4,1,7}; print(array);//打印 for(int i = 0; i < ar

排序算法学习之简单排序(冒泡排序,简单选择排序,直接插入排序)

一.冒泡排序 冒泡排序算是最基础的一种算法了,复杂度为O(N^2),其基本思想是:从最低端数据开始,两两相邻比较,如果反序则交换.代码如下: /*最基本的冒泡排序*/ void BubbleSort1 (int n, int *array) /*little > big*/ { int i, j; for (i=0; i<n-1; i++) { for (j=n-1; j>i; j--) { if (array[j] < array[j-1]) { int temp = array

Java数据结构系列之——简单排序:冒泡、简单选择、直接插入

package SimpleSort; public class SimpleSort { /** * 冒泡排序:每次循环过程中,小的排在后面的数会像水中的 * 气泡一样慢慢往上冒,所以命名为冒泡排序了,我猜是这样子的..... */ public void BubbleSort(int[] array){ for(int i=0;i<array.length;i++){ for(int j=array.length-1;j>i;j--){//注意此处j是从后往前循环 if(array[j-1

算法导论 第6章 堆排序(简单选择排序、堆排序)

堆数据结构实际上是一种数组对象,是以数组的形式存储的,可是它能够被视为一颗全然二叉树,因此又叫二叉堆.堆分为下面两种类型: 大顶堆:父结点的值不小于其子结点的值,堆顶元素最大 小顶堆:父结点的值不大于其子结点的值,堆顶元素最小 堆排序的时间复杂度跟合并排序一样,都是O(nlgn),可是合并排序不是原地排序(原地排序:在排序过程中,仅仅有常数个元素是保存在数组以外的空间),合并排序的全部元素都被复制到另外的数组空间中去,而堆排序是一个原地排序算法. 1.在堆排序中,我们通常使用大顶堆来实现,因为堆

算法一之简单选择排序

一.  选择排序的思想 选择排序的基本思想是:每一趟在n-i+1(i=1,2,-n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录.基于此思想的算法主要有简单选择排序.树型选择排序和堆排序. 简单选择排序的基本思想:第1趟,在待排序记录r[1]~r[n]中选出最小的记录,将它与r[1]交换:第2趟,在待排序记录r[2]~r[n]中选出最小的记录,将它与r[2]交换:以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕.