变形的合并排序

2024-06-01 16:58
文章标签 排序 合并 变形

本文主要是介绍变形的合并排序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

算法要求:

输入一串数字(int),保存到数组中,比如[1,2,4,2,7,8,5,6,9,2,0,1]。

扫描一遍数组获取到已经排好序的数字序列,上面的例子就是[1,2,4],[2,7,8],[5,6,9],[2],[0,1]。

然后将第一个和第二个已经排好序的序列进行排序,将第三个和第四个进行排序,依次类推。

第一遍排完后,按照上面那个规则进行排序。直到排好序。

好像称之为合并排序的变形。


代码使用Java写的。代码并不好看,因为技术的原因,用了很多的控制变量,导致程序的阅读

比较难受。第一次写这种算法程序,希望以后能够写的好点。


代码如下:

public class Qsort {
<span style="white-space:pre">	</span>//主方法public static void main(String[] args) {//int n[] = new int[]{1,2,3,4,3,2,1,7,8,5,14,16,13};<span style="white-space:pre">		</span>//方便测试就没有输入,直接把数组写死了。//int n[] = new int[]{1,2,3,4,100,23,213,77,43,5,9,11,11};int n[] = new int[]{10,9,8,7,6,5,4,3,2,1};//int n[] = new int[]{1,1,1,1,1,1,1,1,1,1,1};		int[] b = getCount(n);sort(n, b);<span style="white-space:pre">	</span>//将需要被排序的n和保存已经排好序的序列个数的数组b传递进去。}//获取数组中已经排好序的每个序列的个数,将结果保存在数组中。public static int[] getCount(int[] n){int i = 0, count = 0, j = -1;int[] b = new int[n.length+1];//遍历一遍,获取到每个排好序的序列的个数,保存在b[]中while((i+1) < n.length){if(n[i] <= n[i+1]){i++;}else{	b[count++] = (i - j);j = i++;}}b[count] = (n.length-1 - j);count++;if(count == 1){<span style="white-space:pre">		</span>//如果count为1,说明输入的数组已经排好序了。System.out.print("\n排序结束:");print(n);System.exit(0);}//print(b);return b;<span style="white-space:pre">	</span>//将b数组返回}//打印数组方法public static void print(int n[]){for(int j = 0; j < n.length; j++){	System.out.print(n[j]+" ");}System.out.println();}//排序方法public static void sort(int[] n, int[] b){int i = 0, j = 0, q = 0;<span style="white-space:pre">	</span>//控制变量太多,我已经无力吐槽自己了。int count = 0, k = 0;while(b[k++] != 0){		//获取count:已经排好序的数组个数count++;<span style="white-space:pre">		</span>//这个值可以从getCount()方法中传递过来的,所以这个循环是多余的}k = 0;for(i = count/2; i >= 1; i--){<span style="white-space:pre">	</span>//根据count值可以知道每轮需要循环排序几次int[] sortA = new int[b[j]];	//生成两个新的数组,数组大小为b[i]int[] sortB = new int[b[j+1]];//给两个数组赋值int indexA = 0;int indexB = 0;for( ; indexA < sortA.length; indexA++){sortA[indexA] = n[k++];}for( ; indexB < sortB.length; indexB++){sortB[indexB] = n[k++];}//排序indexA = 0; indexB = 0;while(indexA < sortA.length && indexB < sortB.length){if(sortA[indexA] <= sortB[indexB]){n[q++] = sortA[indexA++];}else{n[q++] = sortB[indexB++];}				}if(indexA < sortA.length){for(; indexA < sortA.length; indexA++){n[q++] = sortA[indexA];}}else if(indexB < sortB.length){for(; indexB < sortB.length; indexB++){n[q++] = sortB[indexB];}}j = j+2;}print(n);b = getCount(n);sort(n, b);	}
}

程序写的一般,最近在看《代码之美》这本书,希望以后能够改善吧。

还有我想说,写算法还是用C写比较好。

这篇关于变形的合并排序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1021580

相关文章

数据结构9——排序

一、冒泡排序 冒泡排序(Bubble Sort),顾名思义,就是指越小的元素会经由交换慢慢“浮”到数列的顶端。 算法原理 从左到右,依次比较相邻的元素大小,更大的元素交换到右边;从第一组相邻元素比较到最后一组相邻元素,这一步结束最后一个元素必然是参与比较的元素中最大的元素;按照大的居右原则,重新从左到后比较,前一轮中得到的最后一个元素不参4与比较,得出新一轮的最大元素;按照上述规则,每一轮结

七种排序方式总结

/*2018.01.23*A:YUAN*T:其中排序算法:冒泡排序,简单排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序*/#include <stdio.h>#include <math.h>#include <malloc.h>#define MAXSIZE 10000#define FALSE 0#define TRUE 1typedef struct {i

拓扑排序——C语言

拓扑排序(Topological Sorting)是一种用于有向无环图(DAG)的排序算法,其输出是图中所有顶点的线性排序,使得对于每条有向边 (u, v),顶点 u 在 v 之前出现。拓扑排序确定了项目网络图中的起始事件和终止事件,也就是顶点的执行顺序。         因为是有向无环图,所以拓扑排序的作用其实就是把先发生的排序在前面,后发生的排序到后面。 例如现在我们有一个

嵌入式学习——数据结构(哈希、排序)——day50

1. 查找二叉树、搜索二叉树、平衡二叉树 2. 哈希表——人的身份证——哈希函数 3. 哈希冲突、哈希矛盾 4. 哈希代码 4.1 创建哈希表 4.2  5. 算法设计 5.1 正确性 5.2 可读性(高内聚、低耦合) 5.3 健壮性 5.4 高效率(时间复杂度)时间复杂度越低,效率越高, 5.5 低储存(空间复杂度)空间复杂度越低,存储空间越少 6.排序算法 6.1 冒

JeecgBoot v3.7.0 all 版本发布,前后端合并一个仓库

项目介绍 JeecgBoot是一款企业级的低代码平台!前后端分离架构 SpringBoot2.x,SpringCloud,Ant Design&Vue3,Mybatis-plus,Shiro,JWT 支持微服务。强大的代码生成器让前后端代码一键生成! JeecgBoot引领低代码开发模式(OnlineCoding-> 代码生成-> 手工MERGE), 帮助解决Java项目70%的重复工作,让开

leetcode刷题(40)——83. 删除排序链表中的重复元素

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3->3 输出: 1->2->3 平时我们删除一个链表中的某个元素,一般都是以下的写法: temp.next = temp.next.next; 这样temp.next就被删除了 此题解法如下: class Solution

无法解决 equal to 运算中 Chinese_PRC_90_CI_AS 和 Chinese_PRC_BIN 之间的排序规则冲突

这是因为数据库 oa 和 hh 的编码格式不一样导致的 select  groupname as oper_id,name as oper_name from security_users where name collate Chinese_PRC_CI_AS not in (select oper_name from PDA_UsersAndPWD )

Java中的排序比较方式:自然排序和比较器排序

这里所说到的Java中的排序并不是指插入排序、希尔排序、归并排序等具体的排序算法。而是指执行这些排序算法时,比较两个对象“大小”的比较操作。我们很容易理解整型的 i>j 这样的比较方式,但当我们对多个对象进行排序时,如何比较两个对象的“大小”呢?这样的比较 stu1 > stu2 显然是不可能通过编译的。为了解决如何比较两个对象大小的问题,JDK提供了两个接口 java.lang.Comparab

php4种排序

arr=array(1,43,54,62,21,32,36,76,39);functionbubblesort( arr=array(1,43,54,62,21,32,36,76,39); function bubblesort(arr){ len=count( len=count(arr); //冒泡的轮数 //每轮需要冒泡的次数 for( k=1; k=1;k< len; len

Python批量读取csv文件并合并文件

import pandas as pdimport os # 获取当前路径cwd = os.getcwd()# 要拼接的文件夹及其完整路径,注不要包含中文## 待读取批量csv的文件夹 read_path = 'data_Q1_2018' ## 待保存的合并后的csv的文件夹 save_path = 'data_Q1_2018_merge' ## 待保存