#include<iostream>
using namespace std;
void quicksort(int arr[],int low,int high);
void mergesort(int *a,int l,int r,int *b);
int main() {
int nums[10] = {5,6,3,7,4,2,1,9,8,0};
int b[10];
mergesort(nums,0,9,b);
for (int i = 0;i<=9;i++) {
cout<<nums[i]<<' ';
}
return 0;
}
void quicksort(int arr[], int low, int high){
if (high <= low) return;
int i = low;
int j = high + 1;
int key = arr[low];
while (true)
{
/*从左向右找比key大的值*/
while (arr[++i] < key)
{
if (i == high){
break;
}
}
/*从右向左找比key小的值*/
while (arr[--j] > key)
{
if (j == low){
break;
}
}
if (i >= j) break;
/*交换i,j对应的值*/
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
/*中枢值与j对应值交换*/
int temp = arr[low];//也就是说这个key值让右面的数组继续使用,而左边的数组重新启用一个新key值
arr[low] = arr[j];
arr[j] = temp;
quicksort(arr, low, j - 1);
quicksort(arr, j + 1, high);
}
void mergesort(int *a,int l,int r,int *b){
if(l>=r)
return ;
int mid=l+r;
mid/=2;
mergesort(a,l,mid,b); //左边有序
mergesort(a,mid+1,r,b); //右边有序
int k=l,i=l,j=mid+1; //注意k的初值
while(i<=mid&&j<=r){ //将i-mid和j-r两组有序序列,归并在一个有序序列中
if(a[i]<=a[j])
b[k++]=a[i++];
else
b[k++]=a[j++];
}
//两个循环在一层递归中最终只有一个会运行
while(i<=mid) //将i-mid剩余的数放在最后
b[k++]=a[i++];
while(j<=r) //将j-r剩余的数放在最后
b[k++]=a[j++];
for(k=l;k<=r;k++) //将b数组中的数据拷贝到原数组中
a[k]=b[k];
}
快排归并排模板(含略详细的填坑注释说明)
最新推荐文章于 2020-08-01 10:58:57 发布