基础排序

Posted longui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础排序相关的知识,希望对你有一定的参考价值。

概述

排序的思想有很多种,其中最基础的三种排序即,选择排序,插入排序,冒泡排序,下面通过数组中的元素排序代码来实现三种排序思想。

选择排序

使用到双指针思想,一个游历指针(用于遍历数组中所有元素,选择出指定元素),一个标记指针(用于标记有序数组的末尾),使用到这种思想还可用于数组去重数组去除指定元素等解题手段。

for i:=0;i<len(arr)-1;i++{
    min := i
    for j:=i+1;j<len(arr);j++{
        if arr[i]>arr[j] {
            min = j
        }
    }
    if i!=min {
        arr[i],arr[min] = arr[min],arr[i]
    }
}

冒泡排序

  1. 什么是冒泡?(冒泡就是,数组元素遍历所有元素并比较后面一个元素,若大于后面元素则交换元素,这样一次遍历交换(冒泡)就选出了最大的元素)
  2. 需要冒泡几次?(每次冒泡会选出一个相对较大元素,那么需要冒泡数组的长度个数,即让整个数组有序)
for i:=0;i<len(arr);i++{
    for j:=0;j<len(arr)-1;j++{
        if arr[j]>arr[j+1] {
            arr[j],arr[j+1] = arr[j+1],arr[j]
        }
    }
}
  1. 优化一,每次冒泡次数可以减少
for i:=0;i<len(arr)-1;i++{  //只剩一个,不需要冒泡
    for j:=0;j<len(arr)-1-i;j++{    //已冒泡元素相对有序,无需冒泡
        if arr[j]>arr[j+1] {
            arr[j],arr[j+1] = arr[j+1],arr[j]
        }
    }
}
  1. 优化二,记录相对有序,减少冒泡次数
for i:=0;i<len(arr)-1;i++{  //只剩一个,不需要冒泡
    isneedexchange := false
    for j:=0;j<len(arr)-1-i;j++{    //已冒泡元素相对有序,无需冒泡
        if arr[j]>arr[j+1] {
            arr[j],arr[j+1] = arr[j+1],arr[j]
            isneedexchange = true
        }
    }
    if !isneedexchange {
        break
    }
}

插入排序

遍历数组中每个元素,假定该元素前面的元素有序,尝试插入到合适的位置(往前遍历,寻找一个大于自己的元素,若不大于自己则往后挪,直到最后跳出循环时指向的下标小于自己,那么就将该元素插入到该下标后面的元素)

  1. 写法一:
for i:=1;i<len(arr);i++{
    tmp := arr[i]
    for j:=i;j>0&&arr[j-1]>tmp;j--{
        arr[j] = arr[j-1]
    }
    arr[j] = tmp
}
  1. 写法二:
for i:=1;i<len(arr);i++{
    tmp := arr[i]
    for j:=i-1;j>=0&&arr[j]>tmp;j--{
        arr[j+1] = arr[j]
    }
    arr[j+1] = tmp
}

以上是关于基础排序的主要内容,如果未能解决你的问题,请参考以下文章

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

算法排序之堆排序

[vscode]--HTML代码片段(基础版,reactvuejquery)

[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础

以下代码片段的时间复杂度是多少?

markdown 数组排序片段