zoukankan      html  css  js  c++  java
  • 选择排序算法

    三 ,选择排序

          从算法逻辑上看,选择排序是一种简单直观的排序算法,在简单选择排序过程中,所需移动记录的次数比较少。

     1,基本思想

         选择排序的基本思想:比较+交换

    在待排序的一组数据中,选出最小(最大)的一个数与第一个位置的数交换,然后在剩下的数中,再找最小(最大)的数与第二个位置的数交换位置,

    依次类推,直到第N-1个元素与第N个元素交换位置,选择排序结束。

    2,过程描述

          

    操作方法:
    第一趟:从n个记录中找出关键码最小的记录和第一个记录交换;
    第二趟:从第二个记录开始的n-1个记录中再选出关键码最小的记录与第二个记录交换
    以此类推......
    第i趟,则从第i个记录开始的n-i+1个记录中选出关键码最小的记录与第i个记录交换,直到整个序列按关键码有序。

     3,代码案例:

          

    public class SelectSort {
        
       public static void main(String[] args) {
           
           //定义一个数组
           int arr[]={3,1,2,5,4};
           SelectSort(arr);
           System.out.println("选择排序:"+Arrays.toString(arr));
           
       }
       public static void SelectSort(int[] array) {
           
           //判断数组为空或为一个元素的情况
           if (null == array || array.length <= 1) {
               return;
           }
           //数组比较次数n-1
           for (int i = 0; i < array.length - 1; i++) {
               
               int min = i;//保存当前最小元素的位置
               //遍历待排序数组元素(i之后的元素)
               for (int j = i + 1; j < array.length; j++) {
                   //如果已排序中  较大元素  大于   待排序元素中的  最小元素 则更换元素对应索引
                   if (array[min] > array[j]) {
                       min = j;
                   }
                   //确保找出待排序的最小元素的编号
               }
               //置换位置
               int temp = array[min];
               array[min] = array[i];
               array[i] = temp;
           }
       }
      
    }

    4,选择排序的时间复杂度

        简单选择排序的比较次数与序列的初始排序无关。假设待排序的系列有N个元素,则比较次数总是N(N-1)/2
       而移动次数与系列的初始排序有关,当排序正序时,移动次数最少,为0
       当序列反序时,移动次数最多,为3N(N-1)/2
       所以,综上,简单排序的时间复杂度为O(N*N)

    平均时间复杂度最好情况最坏情况空间复杂度
    O(n²) O(n²) O(n²) O(1)

                 选择排序的简单和直观名副其实,这也造就了它”出了名的慢性子”,无论是哪种情况,哪怕原数组已排序完成,它也将花费将近n²/2次遍历来确认一遍。

           即便是这样,它的排序结果也还是不稳定的。 唯一值得高兴的是,它并不耗费额外的内存空间。

     法,在简单选择排序过程中,所需移动记录的次数比较少。

    Java半颗糖
  • 相关阅读:
    高负载的Lamp架构 转自:http://www.litrin.net/2011/04/20/%E9%AB%98%E8%B4%9F%E8%BD%BD%E7%9A%84lamp%E6%9E%B6%E6%9E%84/
    面向对象设计的基本原则
    [Tip: bat] About "%~dp0"
    [Tip: c# override]
    Where partial types fit in
    Further Overrideable things besides Methods
    [Tip]单位换算
    重构代码解决问题的基本思路
    随想编程之道
    VS快捷键
  • 原文地址:https://www.cnblogs.com/2019wxw/p/11234072.html
Copyright © 2011-2022 走看看