美文网首页
01-选择排序(完成)

01-选择排序(完成)

作者: 欢乐毅城 | 来源:发表于2020-08-11 21:48 被阅读0次

选择排序(基本排序算法)—— 不稳定!!!

动态图:

选择排序.gif

一、概念:

原理:就是从需要排序(待排序 )的数据中选择最小的(从小到大排序),然后放在第一个,选择第二小的放在第二个……

二、基本操作(步骤):

package main

import (
    "fmt"
    "math/rand"
    "time"
)

//1.
const (
    num      = 100000
    rangeNum = 100000
)

func main() {
    // fmt.Println(time.Now().Unix() , time.Now().UnixNano())
    randSeed := rand.New(rand.NewSource(time.Now().Unix() + time.Now().UnixNano()))
    var buf []int
    for i := 0; i < num; i++ {
        buf = append(buf, randSeed.Intn(rangeNum))
    }
    t := time.Now()
    // 选择排序
    xuanze(buf)
    fmt.Println(time.Since(t))  //求排序时间,与t := time.Now()配合
}
// 选择排序
func xuanze(buf []int) {
    times := 0
    for i := 0; i < len(buf)-1; i++ {
        min := i
        for j := i; j < len(buf); j++ {
            times++
            if buf[min] > buf[j] {
                min = j
            }
        }
        if min != i {
            tmp := buf[i]
            buf[i] = buf[min]
            buf[min] = tmp
        }
    }
    fmt.Println("xuanze times: ", times)
}

三、时间、空间复杂度与排序稳定性:

  不难看出,寻找最小的元素需要一个循环的过程,而排序又是需要一个循环的过程。因此显而易见,这个算法的时间复杂度是O(n*n)的。这就意味值在n比较小的情况下,算法可以保证一定的速度,当n足够大时,算法的效率会降低。并且随着n的增大,算法的时间增长很快。因此使用时需要特别注意。

时间复杂度: O(n^2)
  选择排序的复杂度分析。第一次内循环比较N - 1次,然后是N-2次,N-3次,……,最后一次内循环比较1次。共比较的次数是 (N - 1) + (N - 2) + … + 1,求等差数列和,得(N−1+1)∗N/2=(N^2) /2(N - 1 + 1)* N / 2 = (N^2) / 2(N−1+1)∗N/2=(N^2)/2。舍去最高项系数,其时间复杂度为 O(N^2)。
  虽然选择排序和冒泡排序的时间复杂度一样,但实际上,选择排序进行的交换操作很少,最多会发生 N - 1次交换。而冒泡排序最坏的情况下要发生N^2 /2交换操作。从这个意义上讲,交换排序的性能略优于冒泡排序。而且,交换排序比冒泡排序的思想更加直观。

空间复杂度:O(1)
  最优的情况下(已经有顺序)复杂度为:O(0) ;最差的情况下(全部元素都要重新排序)复杂度为:O(n );平均的复杂度:O(1)

稳定性:不稳定
  理由 ==> 在一趟循环排序中,如果当前元素比一个元素小,而该小的元素又出现在和当前元素相等 的元素的后面,那么交换后稳定性就被破坏了。
  例子 ==> 序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。

相关文章

  • 01-选择排序(完成)

    选择排序(基本排序算法)—— 不稳定!!! 动态图: 一、概念: 原理:就是从需要排序(待排序 )的数据中选择最小...

  • 排序【2】— 选择排序

    选择排序实现原理:从待排序元素中选择最小(最大)的元素作为首元素,直到排序完成。

  • java数据结构与算法 - 排序

    冒泡排序 选择排序 选择排序的时间复杂度分析:选择排序使用了双层for循环,其中外层循环完成了数据交换,内层循环完...

  • 排序 二分查找 2019-04-12

    排序 实现归并排序、快速排序、插入排序、冒泡排序、选择排序、堆排序(选做)(完成leetcode上的返回滑动窗口中...

  • DOM操作四-BOM对象

    01-选择水果(简单版) 02-选择水果(封装版) 03-水果排序(终极版) 04-在线用户 05-祝愿墙 06-...

  • 简单选择排序

    选择排序的初步思想:在排序时找到合适的关键字再做交换,并且只移动一次就完成相应关键字的排序定位工作。 简单选择排序...

  • 2019-04-28 冒泡、选择、插入排序核心代码

    选择排序和冒泡排序与数据状况无关,无论数据是否有序,都需要按部就班地完成排序;而插入排序与数据状况有关,若给定数据...

  • 算法-选择排序

    算 法:选择排序算法时间复杂度: 选择排序算法概述 选择排序伪代码 选择排序实现 选择排序算法概述 排序算法有许...

  • 常见排序算法

    这里介绍四种排序算法,选择排序、快速排序、归并排序、计数排序 选择排序(使用递归) 选择排序(使用循环) 快速排序...

  • java 经典选择排序法

    选择排序: 选择排序比较时每次只会记录下最小的(或者最大的)的位置,一轮比较完成之后才会进行对应位置和最小位置(...

网友评论

      本文标题:01-选择排序(完成)

      本文链接:https://www.haomeiwen.com/subject/ofimbctx.html