方法一:快速排序。(整了很久,还是基础不到位)
class Solution {
void QuickSort(vector<int> & num , int left,int right)
{
if(left>=right)
return ;
int L = left;
int R = right;
int target = num[left];
while(left<right)
{
while(left<right&&num[right]>=target)
{
right--;
}
if(left<right)
{
num[left] = num[right];
}
while(left<right&&num[left]<target)
{
left++;
}
if(left<right)
{
num[right] = num[left];
}
if(left>=right)
num[left] = target;
}
QuickSort(num,L,left-1);
QuickSort(num,left+1,R);
}
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int length1 = m+n;
int length2 = n;
for(int i = 0;i<n;i++)
nums1[m+i] = nums2[i];
QuickSort(nums1,0,length1-1);
}
};
方法二:
双指针。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int p1 = 0, p2 = 0;
int sorted[m + n];
int cur;
while (p1 < m || p2 < n) {
if (p1 == m) {
cur = nums2[p2++];
} else if (p2 == n) {
cur = nums1[p1++];
} else if (nums1[p1] < nums2[p2]) {
cur = nums1[p1++];
} else {
cur = nums2[p2++];
}
sorted[p1 + p2 - 1] = cur;
}
for (int i = 0; i != m + n; ++i) {
nums1[i] = sorted[i];
}
}
};
方法三:
逆向双指针。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int p1 = m - 1, p2 = n - 1;
int tail = m + n - 1;
int cur;
while (p1 >= 0 || p2 >= 0) {
if (p1 == -1) {
cur = nums2[p2--];
} else if (p2 == -1) {
cur = nums1[p1--];
} else if (nums1[p1] > nums2[p2]) {
cur = nums1[p1--];
} else {
cur = nums2[p2--];
}
nums1[tail--] = cur;
}
}
}