归并排序
对一个元素个数为20个的随机数组进行快速排序
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void Display(int *arr, int n){
for (register int i = 0; i < n; i++){
printf("%d ", arr[i]);
}
printf("\n");
}
void merge(int *arr, int L, int M, int R){
int LEFT_SIZE = M - L;
int RIGHT_SIZE = R - M + 1;
int left[LEFT_SIZE];
int right[RIGHT_SIZE];
int i, j, k;
//将原数组左边分到一个新数组left中
for(i = L; i < M; i++){
left[i - L] = arr[i];
}
//将原数组右边分到一个新数组right中
for(i = M; i <= R; i++){
right[i - M] = arr[i];
}
i = 0; j = 0; k = L;
while(i < LEFT_SIZE && j < RIGHT_SIZE){
//如果left数组的第一个数字比right数组第一个数字小就把它放到新数组里
if(left[i] < right[j]){
arr[k] = left[i];
i++;
k++;
}else{
arr[k] = right[j];
j++;
k++;
}
}
while(i < LEFT_SIZE){
arr[k] = left[i];
i++;
k++;
}
while(j < RIGHT_SIZE){
arr[k] = right[j];
j++;
k++;
}
}
void mergesort(int *arr, int L, int R){
int M = (L + R)/2;
if(L == R){
return;
}else{
printf("归并排序中:");
Display(arr, 20);
mergesort(arr, L, M);
mergesort(arr, M+1, R);
merge(arr, L, M+1, R);
}
}
int main(){
int arr[20] = {6,5,4,3,2,1,8,7,0,9,11,33,22,55,77,44,66,99,888,90};;
//生成一个有20个元素的随机数组
srand((unsigned int)time(0));//修改种子
for (register int i = 0; i < 20; i++){
arr[i] = rand();
}
printf("原数组为:\n");
Display(arr, 20);
printf("\n");
int L = 0;
int R = 19;
mergesort(arr, L, R);
printf("\n归并排序后:\n");
Display(arr, R+1);
return 0;
}
如有不足,欢迎各位大佬指正