Insert sort
需求
输入n个数字,(第一行数字表示将要输入数字的个数)
按从小到大的顺序排序后一行输出
示例
输入:
5
12
45
2
14
1
输出:
1 2 12 14 45
解题思路
今天使用插入排序来解决这个问题
- 循环需要排序的数组
- 从第二个数字开始,和前一个比较,如果比前一个小,就说明这第i个数字n需要重新排序
- 将这个数字和前面的所有数字比较,当n比第j个数字位置小的时候(j<i),则说明这个j位置就是n需要插入的位置
- 将j位置到i-1位置的数字全部顺序向后移动一个位置,即将【i-1】赋给【i】,最后将最开始的【i】赋给【j】
- 循环完数组则排序完毕,over
func insertSort(disorderNumber []int) []int {
for i := 1; i < len(disorderNumber); i++ {
if disorderNumber[i] < disorderNumber[i-1] {
for j := 0; j < i; j++ {
if disorderNumber[j] > disorderNumber[i] {
// 插入位置
temp := disorderNumber[i]
// 将插入位置后面的数到需要插入的数整体后移一位
for k := i; k > j; k-- {
disorderNumber[k] = disorderNumber[k-1]
}
disorderNumber[j] = temp
}
// 如果找到插入位置,则不需要再向后面循环
break
}
}
}
return disorderNumber
}
完整代码
package main
import (
"fmt"
"os"
"strconv"
)
func main() {
var num int
n, err := fmt.Scanf("%d", &num)
if n != 1 || err != nil {
os.Exit(1)
}
disorderNumber := make([]int, num)
for i := 0; i < num; i++ {
n, err := fmt.Scanf("%d", &disorderNumber[i])
if n != 1 || err != nil {
fmt.Println(n,err)
os.Exit(1)
}
}
orderNumber := insertSort(disorderNumber)
for i := 0; i < len(orderNumber); i++ {
fmt.Print(strconv.Itoa(orderNumber[i]) + " ")
}
}
func insertSort(disorderNumber []int) []int {
for i := 1; i < len(disorderNumber); i++ {
if disorderNumber[i] < disorderNumber[i-1] {
for j := 0; j < i; j++ {
if disorderNumber[j] > disorderNumber[i] {
// 插入位置
temp := disorderNumber[i]
// 将插入位置后面的数到需要插入的数整体后移一位
for k := i; k > j; k-- {
disorderNumber[k] = disorderNumber[k-1]
}
disorderNumber[j] = temp
}
// 如果找到插入位置,则不需要再向后面循环
break
}
}
}
return disorderNumber
}