反向归并排序

使用空间O(1),时间O(m+n)

#include<stdio.h>

#define lenA 5

#define lenB 6

 

int a[lenA+lenB] = {1,3,5,7,9};

int b[lenB] = {2,4,6,8,10,11};

 

void reverse_union(){

int _lenA = lenA;

int _lenB = lenB;

while(_lenA>0 && _lenB>0){

if(a[_lenA-1] < b[_lenB-1]){

a[_lenA-1+_lenB] = b[_lenB-1];

_lenB--;

}else if(a[_lenA-1] > b[_lenB-1]){

a[_lenA-1+_lenB] = a[_lenA-1];

_lenA--;

}else{

a[_lenA-1+_lenB] = a[_lenA-1];

_lenB--;

_lenA--;

}

}

if(_lenA == 0){

for(;_lenB>0;_lenB--)

a[_lenB-1] = b[_lenB-1];

}

}

int main(){

int i ;

reverse_union();

for(i=0;i<lenA+lenB;i++)

printf("%d ",a[i]);

}

Java中实现归并排序算法(包括降序排列)可以分为两步:首先对数组进行递归分割,然后合并两个已排序的部分。以下是将两个已经排序的半部分按降序合并的代码示例: ```java public class MergeSortDescending { public static void merge(int[] arr, int left, int middle, int right) { // 创建临时数组用于存储结果 int[] temp = new int[right - left + 1]; int i = left; int j = middle + 1; int k = 0; // 比较并把较大的元素放入temp数组 while (i <= middle && j <= right) { if (arr[i] >= arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } // 把剩余未处理的左边部分复制到temp数组 while (i <= middle) { temp[k++] = arr[i++]; } // 把剩余未处理的右边部分复制到temp数组 while (j <= right) { temp[k++] = arr[j++]; } // 将排序后的temp数组内容复制回原数组 for (int x = 0; x < temp.length; x++) { arr[left + x] = temp[x]; } } public static void main(String[] args) { int[] arr = {5, 9, 2, 6, 7, 1, 8, 3, 4}; mergeSortDescending(arr, 0, arr.length - 1); System.out.println("Sorted array in descending order:"); for (int num : arr) { System.out.print(num + " "); } } // 归并排序函数,注意这里是从大到小的顺序,所以比较条件反向 private static void mergeSortDescending(int[] arr, int left, int right) { if (left < right) { int mid = (left + right) / 2; mergeSortDescending(arr, left, mid); mergeSortDescending(arr, mid + 1, right); // 合并过程 merge(arr, left, mid, right); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值