首页 > 编程语言 >排序算法

排序算法

时间:2022-10-21 00:44:27浏览次数:52  
标签:arr copy int len ++ 算法 low 排序

1、归并排序

归并是把两个或两个以上有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的,然后把有序子序列合并为整体有序序列。

注意:在递归中必须传入(low, middle)和(middle+1, high),而快排的递归中可以是(low, middle - 1)和(middle+1, high)

递归实现:

public void merge(int[] arr) {
if (arr == null || arr.length == 0)
return;
int[] copy = new int[arr.length];
mergeSort(arr, copy, 0, arr.length - 1);
}

private void mergeSort(int[] arr, int[] copy, int low, int high) {
if (low == high)
return;
int mid = (low + high) / 2;
mergeSort(arr, copy, low, mid);
mergeSort(arr, copy, mid + 1, high);
int i = mid;
int j = high;
int locCopy = high;
while (i >= low && j > mid) {
if (arr[i] > arr[j])
copy[locCopy--] = arr[i--];
else
copy[locCopy--] = arr[j--];
}
while (i >= low) {
copy[locCopy--] = arr[i--];
}
while (j > mid) {
copy[locCopy--] = arr[j--];
}
for (int k = low; k <= high; k++) {
arr[k] = copy[k];
}
}

非递归实现:

public void mergeSort(int[] arr) {
int len = 1;
while (len < arr.length) {
for (int i = 0; i < arr.length; i += 2 *len) {
merge(arr, i, len);
}
len *= 2;
}
}

public void merge(int[] arr, int i, int len) {
int start = i;
int lenI = i + len;
int j = i + len;
int lenJ = j + len;
int[] temp = new int[len * 2];
int count = 0;
while (i < lenI && j < lenJ && j < arr.length) {
if (arr[i] <= arr[j]) {
temp[count++] = arr[i++];
} else {
temp[count++] = arr[j++];
}
}
while (i < lenI && i < arr.length) {
temp[count++] = arr[i++];
}
while (j < lenJ && j < arr.length) {
temp[count++] = arr[j++];
}
count = 0;
while (start < j && start < arr.length) {
arr[start++] = temp[count++];
}
}
 

 

标签:arr,copy,int,len,++,算法,low,排序
From: https://www.cnblogs.com/MarkLeeBYR/p/16812115.html

相关文章

  • 每日算法:驼峰转换,判断连续字符
    每日算法今日是:1、将字符串转换为驼峰格式2、判断字符串中是否有连续重复的字符将字符串转换成驼峰格式//css中经常有类似background-image这种通过-连接的字......
  • python | 算法-拓扑排序
    写在前面:我自己用python练习算法与数据结构的典型算法汇总在这里:汇总-算法与数据结构-python版,欢迎翻阅!1️⃣参考链接:https://github.com/algorithmzuo/algorithmbasic......
  • 通俗易懂谈强化学习之Q-Learning算法实战
     Datawhale干货 作者:知乎KingJames,伦敦国王大学​前言:​​上篇​​介绍了什么是强化学习,应大家需求,本篇实战讲解强化学习,所有的实战代码可以自行下载运行。本篇使用强化......
  • sql语句排序无效的问题
    数据可视化时因为数据类型排序无效的问题:这是由于你要排序的类型是String类型的而ORDERBY方法排序要求整数型。这就需要在ORDERBY后加CAST(需要排序的字段A......
  • [图像算法] Linemod算法研究 (一)
    Linemod算法研究(一)开始研究传统图像处理算法,近期不再做任何deeplearning相关内容,请暂时不要咨询我deeplearning相关的东西。。。先了解一下大致工作流程:ref:Grad......
  • 【数据结构/C语言】用链栈对整数进行升序排序
    #pragmawarning(disable:4996)#include<stdio.h>#include<stdlib.h>typedefintElemtype; typedefintStatus;typedefstructStack*SqList;typedefstructSt......
  • "百钱买百鸡"的优化算法
       最近独到一篇关于"百钱买百鸡"的Python编程,觉得挺有意思,索性自己改写一下优化算法。   原题目:#我国古代数据加张邱建在《算经》中提出一个著名的数序为......
  • 基于Redis实现点赞、点赞用户按时间排序、好友关注和共同关注等业务
    点赞功能业务说明1、每个用户只能点一次赞,再次点击时取消点赞2、在Blog属性中增加isLike字段,用于判断当前用户是否点赞3、isLike的值从Redis中获取,可以用redis自带的......
  • 冒泡排序自写
    /***冒泡排序*/publicvoidcodeGgt1(){int[]a={4,2,6,8,9,3,6,0};for(intj=a.length;j>1;j--){for(inti=0;i<a.length-1;i++){if(a[i]>......
  • 【路径规划】基于麻雀算法的路径优化问题附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......