`
fourfireliu
  • 浏览: 95586 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

无聊想到种排序方式,不知道属于什么排序

阅读更多

查了下原来也属于快排的一种实现,了解了

 

package com.fourfireliu.test;

public class MySort {
	//计算循环次数
	private static int count1 = 0;
	//计算互换次数
	private static int count2 = 0;
	
	
	public static void main(String args[]) {
		int[] testArray = {3,3,0,3,3};
		MySort qs = new MySort();
		qs.sort(testArray);
	}
	
	public void sort(int[] array) {
		if (array!=null&&array.length>1) {
			sort(array, 0, array.length-1);	
		}
		
		//打印结果
		System.out.println();
		for (int i:array) {
			System.out.print(i+" ");
		}
		
		System.out.println();
		System.out.println("Count1 is " + count1 + " and count2 is " + count2);
	}
	
	//排序基本方法入口
	private void sort(int[] array, int fromIndex, int endIndex) {
		if (isOutOfBound(array, fromIndex)||isOutOfBound(array, endIndex)||fromIndex>=endIndex) {
			return;
		}

		
		int mid = getMid(fromIndex, endIndex);

		int from = getFirstLarger(array, fromIndex, mid);
		int to = getFirstSmaller(array, endIndex, mid);

		//从开头结尾各找一个位置不对的,两者进行互换,直到其中一个先到达中点
		while (from!=-1&&to!=-1) {
			swap(array, from, to);
			from = getFirstLarger(array, from, mid);
			to = getFirstSmaller(array, to, mid);
		}

		//轮询剩下的,将目标数安置在合适位置
		int target = mid;

		if (from!=-1) {
			for (int count=from;count<mid;count++) {
				count1++;
				target = getSwapTarget(array, count, target);
			}
		}

		if (to!=-1) {
			for (int count=to;count>mid;count--) {
				count1++;
				target = getSwapTarget(array, count, target);
			}
		}

		//继续对子列进行如此操作
		sort(array, fromIndex, target-1);
		sort(array, target+1, endIndex);
	}
	
	//在目标数左边搜索第一个比目标数更大的
	private int getFirstLarger(int[] array, int fromIndex, int mid) {
		for (int i=fromIndex;i<mid;i++) {
			count1++;
			if (array[i]>array[mid]) {
				return i;
			} 
		}
		
		return -1;
	}
	
	//在目标数右边搜索第一个比它更小的
	private int getFirstSmaller(int[] array, int fromIndex, int mid) {
		for (int i=fromIndex;i>mid;i--) {
			count1++;
			if (array[i]<array[mid]) {
				return i;
			} 
		}
		
		return -1;
	}
	
	/**
	 * 如果顺序不对,则互换位置
	 * 
	 * @param array
	 * @param count
	 * @param target
	 * @return
	 */
	private int getSwapTarget(int[] array, int count, int target) {
		if (array[count]<array[target]&&count>target) {
			swap(array, count, target);
			target = count;
		}
		
		if (array[count]>array[target]&&count<target) {
			swap(array, count, target);
			target = count;
		}
		
		return target;
	}
	
	private void swap(int[] array, int a, int b) {
		int temp = array[a];
		array[a] = array[b];
		array[b] = temp;
		count2++;
	}
	
	private boolean isOutOfBound(int[] array, int index) {
		return index<0||index>=array.length;
	}
	
	private int getMid(int start, int end) {
		return (start+end)/2;
	}
}

 

分享到:
评论

相关推荐

    深入浅出-C语言8种经典排序算法

    本文将深入浅出地介绍 C 语言中的 8 种经典排序算法,包括冒泡排序、选择排序、插入排序、快速排序、归并排序、基数排序、希尔排序和堆排序。这些算法都是在程序设计中常用的排序方法,了解这些算法对于程序员来说...

    2048:例5.18串排序.cpp

    2048:【例5.18】串排序 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 20603 通过数: 10118 【题目描述】 对给定的n(1≤n≤20) 个国家名(国家名字长度不超过20 ),按其字母的顺序输出。 【输入】 第一行为国家...

    2048:例5.18串排序.cpp(未完成)

    2048:【例5.18】串排序 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 20456 通过数: 10024 【题目描述】 对给定的n(1≤n≤20) 个国家名(国家名字长度不超过20 ),按其字母的顺序输出。 【输入】 第一行为国家...

    小学语文排序练习答案PPT学习教案.pptx

    同时,学生可以尝试模仿这种排序方式写作,探索更多表达内容的方法,将读与写结合,深化对排序技巧的理解。 在实际的应用示例中,如第一题是关于日出场景的排序,根据日出的过程,我们可以确定正确的顺序是:②天边...

    无聊的盒子_单片机_舵机_无聊的盒子_

    标题“无聊的盒子_单片机_舵机_无聊的盒子”揭示了这是一个与电子制作相关的项目,其中涉及单片机和舵机技术。在这个项目中,“无聊的盒子”可能是一个创新的装置,通过舵机来实现其开关功能,增加了互动性和趣味性...

    渣渣c++无聊关机代码,十分无聊

    无聊的关机cpp 无聊的关机cpp 无聊的关机cpp 无聊的关机cpp

    无聊专用聊天页面

    WebSocket提供了一种双向通信方式,使得服务器和客户端可以同时发送数据,提高了交互性。在后端,服务器可能采用Node.js、Python的Flask或Django、Java的Spring Boot等技术栈,处理用户的连接和消息传递。 聊天室的...

    graphSort:NPM 包对有向图上的节点进行部分排序。 用于对从人类进行的成对比较中获得的数据进行排序

    人们 a) 感到无聊 b) 他们的反馈不一致。 图排序允许我们使用传递优势,并在反馈中具有循环(a&gt;b&gt;c&gt;a)。 定义 在本文档中,优势被描述为“A&gt;B”,这就像说“A 对 B 具有优势”。 如果我们有三个节点 A、B、C,并且...

    无聊建站系统源码下载

    【无聊建站系统源码解析】 “无聊建站系统”是一个基于Java开发的免费内容管理系统(CMS),专为快速、高效且安全地搭建各类网站而设计。作为一个专业的IT大师,我将详细介绍这个系统的特性和核心知识点,帮助你...

    无聊java建站系统模板_免费java建站模板下载

    Java建站系统是一种基于Java技术构建的用于快速搭建网站的内容管理系统(CMS)。"无聊java建站系统模板"指的是一个特定的开源项目,旨在为用户提供便捷、高效且安全的建站解决方案。这个系统允许用户通过预设的模板...

    2039:【例5.6】冒泡排序.cpp

    【题目描述】 编程输入n(1≤n≤20)个小于1000非负整数,然后自动按从大到小的顺序输出。(冒泡排序) 【输入】 第一行,数的个数n; 第二行,n个非负整数。 【输出】 由大到小的n个非负整数,每个数占一行。

    无聊软件3.2--方便实用的小工具(40K)

    “无聊软件”是经贸学院论坛追梦管理团队无聊工作室开发的一款方便实用、解闷的小工具,经过压缩,减小代码和结合网站实时更新的功能,使软件现有大小只有40K。 绿色、无毒、无需安装,方便实用。软件主要有“万能...

    Sorting-visualizer:可视化排序算法

    这是一种无聊的Javascript框架。 目的是可视化排序算法的工作方式。 该项目是根据以下文件构建的: demo_array.js-数组包装器,它公开了一个小的api。 它的构造函数获取数组大小和一个Presenter对象。 presentor....

    DIY无聊盒子.rar

    DIY了一个七个开关的无聊盒子,附件里包含了程序(keil5)和结构图(2016版的solidworks),物料清单可以去博客里看(https://blog.csdn.net/qq_39127371/article/details/107799245)

    初中语文经典美文说无聊

    在快节奏、高效率的生活中,人们似乎越来越难以忍受孤独,科技的发展为人们提供了一种逃避无聊的方式——通过不断地进行线上社交和娱乐活动来“杀死”寂寞。 但这种持续的逃避,真的能够满足我们内心深处的需求吗?...

    一个非常非常无聊的东西

    标题 "一个非常非常无聊的东西" 可能是在戏谑地表达这个软件或工具的独特性,它可能是一个非主流或者趣味性的应用,旨在让用户的键盘体验变得与众不同。在IT领域,有时候创新和趣味性的结合可以带来出人意料的用户...

    无聊的c#作品

    无聊的c#作品无聊的c#作品无聊的c#作品无聊的c#作品

    当厨师无聊时会做什么.pptx

    【标题】: "当厨师无聊时会做什么" 这个标题看似与IT行业不直接相关,但它实际上可以引发关于行业专业发展、职业兴趣多样化以及个人技能提升的讨论。在IT行业中,无论是程序员、设计师还是项目经理,都有可能经历...

    无聊简史_csdn

    无聊简史

Global site tag (gtag.js) - Google Analytics