快速排序
//双指针一左一右开始
class Solution {
public:
void fastsort(vector<int>& nums, int start, int end) {
if (start >= end) return;
int left = start;
int right = end;
int index = rand() % (end - start + 1) + start;
swap(nums[start], nums[index]);
int num = nums[start];
while (left < right) {
while (left < right && nums[right] >= num) {//右指针一定要比左指针先处理,>=或者>都行
right--;
}
while (left < right && nums[left] <= num) { //是<=,要不然在left=start时就不动了。这样的话小于等于num的值都在左边。
left++;
}
if (left < right) {
swap(nums[left], nums[right]);
}
}
nums[start] = nums[left];
nums[left] = num;
fastsort(nums, start, left - 1);
fastsort(nums, left + 1, end);
return;
}
vector<int> sortArray(vector<int>& nums) {
srand((unsigned)time(NULL));
fastsort(nums, 0, nums.size() - 1);
return nums;
}
};
归并排序
vector<int> mergesort(vector<int> nums) {
int start = 0;
int end = nums.size() - 1;
if (start >= end) return nums;
int mid = start + (end - start) / 2;
vector<int> v1(nums.begin(), nums.begin() + mid + 1);
vector<int> v2(nums.begin() + mid + 1, nums.end());
vector<int> vec1 = mergesort(v1);
vector<int> vec2 = mergesort(v2);
int index = 0;
int index1 = 0, index2 = 0;
vector<int> temp(end - start + 1, 0);
while (index1 < vec1.size() && index2 < vec2.size()) {
if (vec1[index1] < vec2[index2]) {
temp[index++] = vec1[index1++];
}
else {
temp[index++] = vec2[index2++];
}
}
if (index1 < vec1.size()) {
while (index1 < vec1.size()) {
temp[index++] = vec1[index1++];
}
}
else {
while (index2 < vec2.size()) {
temp[index++] = vec2[index2++];
}
}
return temp;
}
vector<int> sortArray(vector<int>& nums) {
return mergesort(nums);
}
在原数组上修改:
vector<int> tmp;
void mergesort(vector<int>& nums, int l, int r) {
if (l >= r) return;
int mid = (l + r) >> 1;
mergesort(nums, l, mid);
mergesort(nums, mid + 1, r);
int i = l, j = mid + 1;
int cnt = 0;
while (i <= mid && j <= r) {
if (nums[i] <= nums[j]) {
tmp[cnt++] = nums[i++];
}
else {
tmp[cnt++] = nums[j++];
}
}
while (i <= mid) {
tmp[cnt++] = nums[i++];
}
while (j <= r) {
tmp[cnt++] = nums[j++];
}
for (int i = 0; i < r - l + 1; ++i) {
nums[i + l] = tmp[i];
}
}
vector<int> sortArray(vector<int>& nums) {
tmp.resize((int)nums.size(), 0);
mergesort(nums, 0, (int)nums.size() - 1);
return nums;
}
堆排序
void heapsort(int father, int end, vector<int>& nums) {
int left = father * 2 + 1;
int right = father * 2 + 2;
int temp = father;
if (left <= end && nums[father] < nums[left]) father = left;
if (right <= end && nums[father] < nums[right]) father = right;
if (father == left) {
swap(nums[temp], nums[left]);
heapsort(left, end, nums);
}
if (father == right) {
swap(nums[temp], nums[right]);
heapsort(right, end, nums);
}
return;
}
vector<int> sortArray(vector<int>& nums) {
for (int i = (nums.size() - 2) / 2; i >= 0; i--) {
heapsort(i, nums.size() - 1, nums);
}
for (int i = nums.size() - 1; i > 0; i--) {
swap(nums[0], nums[i]);
heapsort(0, i - 1, nums);
}
return nums;
}