主要思想
合并排序的思想
合并排序(Merge Sort)是一种基于分治法(Divide and Conquer)的排序算法。
其主要思想是将待排序的数组分成两部分,分别对两部分进行递归排序,
然后将两个有序的子数组合并成一个有序的数组。
#include "stdio.h"
void merge(int arr[],int left,int right,int pviot){
int len1,len2,i,j,n=left;
len1=pviot-left+1;
len2=right-pviot;
int A[len1],B[len2];
for(i=0;i<len1;i++){
A[i]=arr[left+i];
}
for(i=0;i<len2;i++){
B[i]=arr[pviot+i+1];
}
i=0,j=0;
while(i<len1&&j<len2){
if(A[i]<B[j]){
arr[n++]=A[i++];
}else{
arr[n++]=B[j++];
}
}
//将两个数组中剩余的元素加到arr中
while(i<len1) arr[n++]=A[i++];
while(j<len2) arr[n++]=B[j++];
}
void mergeSort(int arr[],int left,int right){//合并排序算法
int pviot;
if(left<right){
pviot = (left+right)/2;//计算中间下标
//分别对数组左右两边进行合并排序
mergeSort(arr,left,pviot);
mergeSort(arr,pviot+1,right);
merge(arr,left,right,pviot);//将左右两个有序的序列进行排序
}
}
// 打印数组
void printArray(int arr[], int size) {
int i;
for ( i=0;i<size; i++) {
printf("%d ", arr[i]);
}
}
int main(){
int arr[]={9, 5, 2, 13, 1, 8 };//要排序的数组
int size = sizeof(arr) / sizeof(arr[0]);//计算数组的元素个数
printf("原始: ");
printArray(arr,size);
//进行排序
mergeSort(arr, 0, size - 1);
printf("排序后的数组: ");
printArray(arr, size);
return 0;
}