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
}