直接插入排序
思路分析:在要排序的一组数中,假设前面的数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。
第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。
插入排序的基本方法是:每步将一个待排序的记录按其关键字的大小插到前面已经排序的序列中的适当位置,直到全部记录插入完毕为止。
PHP实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| //直接插入排序 function InsertSort(array &$arr){ $count = count($arr); //数组中第一个元素作为一个已经存在的有序表 for($i = 1;$i < $count;$i ++){ $temp = $arr[$i]; //设置哨兵/临时值 //$arr[$i];//需要插入的元素; $arr[$j];//需要比较的元素 for($j = $i - 1;$j >= 0 && $arr[$j] > $temp;$j --){ //发现插入的元素要小,交换位置 //将后边的元素与前面的元素互换 $arr[$j + 1] = $arr[$j]; //将前面的数设置为 当前需要交换的数 $arr[$j] = $temp; } } }
|
GOLANG实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| //直接插入排序 func sort_insert(arr []int){ for i:=1;i<len(arr);i++{ tmp := arr[i] for j:=i-1;j>=0 && arr[j] > tmp; j--{ arr[j],arr[j+1] = tmp,arr[j]; } } }
func main() { arr := [...]int{6,3,8,2,9,1} slice := arr[:] fmt.Println(slice) fmt.Println() sort_insert(slice) fmt.Println(slice) }
|