备战复试,每日三题
题目一: 对链表进行插入排序
给定单个链表的头 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);
}