备战复试,每日三题Day27

备战复试,每日三题

题目一: 对链表进行插入排序

给定单个链表的头 head ,使用 插入排序 对链表进行排序,并返回 排序后链表的头 。

插入排序 算法的步骤:

插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
重复直到所有输入数据插入完为止。
下面是插入排序算法的一个图形示例。部分排序的列表(黑色)最初只包含列表中的第一个元素。每次迭代时,从输入数据中删除一个元素(红色),并就地插入已排序的列表中。

对链表进行插入排序。

示例 1:

输入: head = [4,2,1,3]
输出: [1,2,3,4]
示例 2:

输入: head = [-1,5,3,4,0]
输出: [-1,0,3,4,5]

提示:

列表中的节点数在 [1, 5000]范围内
-5000 <= Node.val <= 5000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/insertion-sort-list

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* insertionSortList(ListNode* head) {
        //设置一个头结点,方便插入
        ListNode* dumyNode=new ListNode(0);
        ListNode* s,*p=head,*q=head->next,*r;
        dumyNode->next=nullptr;
        while(p!=nullptr){
            //每次将无序区的第一个元素与有序区的第一个元素比较
            s=dumyNode,q=dumyNode->next;
            //确保无序区第一个元素(p所指)插入到s所指与q所指之间,不满足则移动指针
            while(q!=nullptr&&q->val<=p->val){
                s=q;
                q=q->next;
            }
            s->next=p;
            r=p->next;
            p->next=q;
            p=r;
        }
        return dumyNode->next;
    }
};

题目二: 简单插入排序

插入排序的思想:(这里我们按照从小到大排序,讲解)
对于n个待排序的数字:

将第一个元素默认放入有序表,其余n-1个元素则在无序表中
无序表中的第一个元素与有序表中的最后一个元素进行比较:
①若小于,则继续与有序表中的倒数第二个元素比较,一直进行此过程,最终的结果:
该元素比有序表的第一个元素还小,则插入到第一个位置||找到了比它还小的元素,执行②
②若大于,则放到其之后(相当于没动)

void insertSort(vector<int>& nums){
	int n=nums.size();
	//划分有序区和无序区,默认数组第一个元素位于有序区
	for(int i=1;i<n;i++){
	//记录无序区的第一个元素
		int val=nums[i];
	//若无序区的第一个元素比有序区的最后一个元素小,则与有序区倒数第二个元素比较...直到找到合适的位置,或是比有序区的所有元素都小
		while(i-1>=0&&nums[i]<nums[i-1]){
		//后移有序区中的元素
			nums[i]=nums[i-1];
			i--;
		}
		//若无序区的第一个元素比有序区的最后一个元素大,则位置不变,不需要移动;若无序区第一个元素比有序区第一个元素还小,则放到第一个位置
		nums[i]=val;
	}
]

题目三: 快速排序

void quickSort(vector<int>& nums,int low,int high){
	if(low>high){
	    return;
	}
	int i=low,j=high;
	int temp=nums[i];
	while(i<j){
		while(i<j&&num[j]>=temp){
			j--;
		}
		if(i<j){
			nums[i]=nums[j];
			i++;
		}
		while(i<j&&nums[i]<=temp){
			i++;
		}
		if(i<j){
			nums[i]=nums[j];
			j--;
		}
	}
	nums[i]=temp;
	quickSort(nums,low,i-1);
	quickSort(nums,i+1,high);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值