归并排序
#include <stdio.h>
void MergeSort(int *nums, int *result, int start, int end){
if(start >= end){
return;
}
int mid = (start + end) / 2;
int start1 = start;
int end1 = mid;
int start2 = mid + 1;
int end2 = end;
MergeSort(nums, result, start1, end1);
MergeSort(nums, result, start2, end2);
int k = start;
while(start1 <= end1 && start2 <= end2){
if(nums[start1] < nums[start2]){
result[k] = nums[start1];
start1++;
k++;
}else{
result[k] = nums[start2];
start2++;
k++;
}
}
while(start1 <= end1){
result[k] = nums[start1];
k++;
start1++;
}
while(start2 <= end2){
result[k] = nums[start2];
k++;
start2++;
}
for(k = start; k <= end; k++){
nums[k] = result[k];
}
}
void Print(int *nums, int size){
for(int i = 0; i < size; ++i){
printf("%d ",nums[i]);
}
}
int main()
{
int nums[] = {5,2,8,9,0,3,7};
int size = sizeof(nums)/sizeof(nums[0]);
int result[sizeof(nums)/sizeof(nums[0])];
MergeSort(nums, result, 0, size-1);
Print(nums, size);
return 0;
}
#include <iostream>
using namespace std;
const int N = 100010;
int temp[N];
void merge_sort(int nums[], int l, int r){
if(l >= r)return;
int mid = l + r >> 1;
merge_sort(nums, l, mid);
merge_sort(nums, mid + 1, r);
int k = 0, i = l, j = mid + 1;
while(i <= mid && j <= r){
if(nums[i] <= nums[j]) temp[k++] = nums[i++];
else temp[k++] = nums[j++];
}
while(i <= mid) temp[k++] = nums[i++];
while(j <= r) temp[k++] = nums[j++];
for(i = l, j = 0; i <= r; i++, j++){
nums[i] = temp[j];
}
}
int main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int n;
cin >> n;
int nums[N];
for(int i = 0; i < n; i++){
cin >> nums[i];
}
merge_sort(nums, 0, n - 1);
for(int i = 0; i < n; i++){
cout << nums[i] << ' ';
}
return 0;
}
快速排序
//确定分界点
//调整区间 分界点左边的数都小于等于x 分界点右边的数都大于等于x (双指针法) (*)
//递归处理左右两段
归并排序
//确定分界点 mid = (l + r) / 2
//递归排序left和right
//归并 合二为一 (*)