排序刷题1(Go)

颜色分类

题目描述

给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

注意: 不能使用代码库中的排序函数来解决这道题。

示例:

输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2]

解题思路

因为数据只有0、1、2,且数据量较少,直接上简单选择排序:每经过一次外层循环,找到最小的数字,进行交换

代码

func sortColors(nums []int)  {
    for i:=0;i<len(nums);i++ {
        min:=i
        for j:=i+1;j<len(nums);j++ {
            if nums[min] > nums[j] {
                 min = j
            }
        }
        if min != i {
            nums[i],nums[min] = nums[min],nums[i]
        }
    }
}

对链表进行插入排序

题目描述

示例 1: 输入: 4->2->1->3 输出: 1->2->3->4

示例 2: 输入: -1->5->3->4->0 输出: -1->0->3->4->5

解题思想

插入排序在这不在赘述,主要是代码编写

代码

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func insertionSortList(head *ListNode) *ListNode {
    if head == nil || head.Next == nil {
        return head
    }
    //新建一个头节点
    h := new(ListNode)
    h.Next = head
    //每次从头遍历找位置的指针
    pre := h
    //当前指针
    cur := head
    //开始遍历
    for cur.Next != nil {
        //下一结点指针
        lat := cur.Next
        
        if lat != nil && lat.Val < cur.Val {
            //如果下一结点不为空,且小于当前指针,使pre移动到cur的前一个位置
            for pre.Next != lat && pre.Next.Val < lat.Val {
                pre = pre.Next
            }
            //进行换序
            temp := pre.Next
            pre.Next = lat
            cur.Next = lat.Next
            lat.Next = temp
            //复位pre
            pre = h
        }else{
            cur = lat
        }

    }
    return h.Next
}