排序算法由于它的任务简单,但是解决问题的思想非常经典,适合入门,因此在很多算法教程里作为第 1 个向读者介绍的算法。
应用在快速排序、归并排序里的分而治之思想、递归实现在计算机的世界里有着广泛的应用。
「力扣」上的很多问题都不会直接考察排序算法,而是考察排序算法体现的思想和细节,例如快速排序的 partition 操作、计算逆序数、找第 k 大元素等。
排序算法很重要,学好它们是学好算法的基础。
1. 合并两个有序数组
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
//看样子这里非递减的意思是递增顺序
//借用一个数组来暂存排序好的元素
vector<int> temp;
//声明两个指针i和j
int i=0,j=0;
while(i<m && j<n){
if(nums1[i]>nums2[j]){
temp.push_back(nums2[j]);
j++;
}else{
temp.push_back(nums1[i]);
i++;
}
}
while(i<m){
temp.push_back(nums1[i]);
i++;
}
while(j<n){
temp.push_back(nums2[j]);
j++;
}
for(int i=0;i<m+n;i++){
nums1[i] = temp[i];
}
}
};
对于两个有序的数组合并,可以用双指针,时间复杂度为O(m+n)
2. 对链表进行插入排序
/**
* 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) {
if(head->next==NULL){
return head;
}
ListNode* phead = new ListNode(0);
phead->next = head;
ListNode* last = head;
ListNode* cur = head->next;
while(cur!=NULL){
if(last->val<=cur->val){
last = last->next;
}else{
ListNode* prev = phead;
while (prev->next->val <= cur->val) {
prev = prev->next;
}
last->next = cur->next;
cur->next = prev->next;
prev->next = cur;
}
cur = last->next;
}
return phead->next;
}
};
对于链表操作来说,要找到关键的指向节点。