自动生成随机数测试归并排序

#include<stdio.h>
#include<time.h>
//数组大小
#define N 100
//随机数的最大值
#define max 100
void merge(int a[],int p,int x,int q,int b[]){
    int i = p, r = x + 1, k=p;
    //保证还有数组的元素没有放入临时数组B[];
    while(i<=x || r <= q){
        //如果r>q成立就说明i<=x一定成立
        //就说明前面那一段数组还有元素没有比较到那时后面那一段数组已经没有元素了
        //如果是r>q不成立就说明r<=q成立如果 if里面的i<=x也成立
        //就说明两段数组都还有元素所以就需要在IF里面比较元素的大小
        if((r > q)||(i <= x &&a[i] <= a[r])){
            b[k++] = a[i++];
        }else{
            b[k++] = a[r++];
        }
    }
    int j;
    //将B数组重新放入A数组
    for(j = p;j <=q;j++)
        a[j] = b[j];
}
void mergeSort(int a[],int p,int q,int b[]){
        if(p<q){
        //将数组平均分为两段
        int x=(q + p)/2;
        //递归
        mergeSort(a,p,x,b);
        mergeSort(a,x+1,q,b);
        merge(a,p,x,q,b);
      
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是Java中使用归并排序对随机进行去重和排序的示例代码: ```java import java.util.Arrays; public class MergeSort { public static void main(String[] args) { int[] nums = {5,3, 8, 6, 2, 7, 1, 4}; System.out.println("排序前:" + Arrays.toString(nums)); mergeSort(nums, 0, nums.length - 1); System.out.println("排序后:" + Arrays.toString(nums)); } public static void mergeSort(int[] nums, int left, int right) { if (left < right) { int mid = (left + right) / 2; mergeSort(nums, left, mid); mergeSort(nums, mid + 1, right); merge(nums, left, mid, right); } } public static void merge(int[] nums, int left, int mid, int right) { int[] temp = new int[right - left + 1]; int i = left, j = mid + 1, k = 0; while (i <= mid && j <= right) { if (nums[i] < nums[j]) { temp[k++] = nums[i++]; } else if (nums[i] > nums[j]) { temp[k++] = nums[j++]; } else { j++; } } while (i <= mid) { temp[k++] = nums[i++]; } while (j <= right) { temp[k++] = nums[j++]; } for (int p = 0; p < temp.length; p++) { nums[left + p] = temp[p]; } } } ``` 该示例代码中,我们使用了归并排序算法对随机数进行排序,并在排序过程中去重。具体实现过程如下: 1. 首先定义一个`mergeSort`方法,该方法接收一个整型数组`nums`、一个整数`left`和一个整数`right`作为参数,表示对`nums`数组中从下标`left`到下标`right`的元素进行排序。 2. 在`mergeSort`方法中,我们首先判断`left`是否小于`right`,如果是,则继续执行排序操作;否则,直接返回。 3. 接着,我们计算出数组中间位置的下标`mid`,并分别对左半部分和右半部分进行递归排序。 4. 最后,我们调用`merge`方法对左右两个有序数组进行合并,从而得到最终的有序数组。 5. 在`merge`方法中,我们首先定义一个临时数组`temp`,用于存储合并后的有序数组。 6. 然后,我们使用两个指针`i`和`j`分别指向左右两个有序数组的起始位置,使用另一个指针`k`指向`temp`数组的起始位置。 7. 接着,我们比较`nums[i]`和`nums[j]`的大小关系,如果`nums[i]`小于`nums[j]`,则将`nums[i]`存入`temp[k]`中,并将`i`和`k`分别加1;如果`nums[i]`大于`nums[j]`,则将`nums[j]`存入`temp[k]`中,并将`j`和`k`分别加1;如果`nums[i]`等于`nums[j]`,则将`nums[j]`舍弃,并将`j`加1。 8. 最后,我们将剩余的元素依次存入`temp`数组中,并将`temp`数组中的元素复制回`nums`数组中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值