java排序算法(冒泡,插入,选择,快速,堆,归并,希尔,基数)
import java.util.Arrays;
import java.util.LinkedList;/*** * * 各种排序: 冒泡,插入,选择,快速,堆,归并,希尔,基数*/
public class Sorts {//1. 冒泡://时间复杂度:n(n-1)/2=O(n^2)//1. 第一次把最大的放后面//2. 把最大的放后面。。。//3. 。。。static void BubbleSort(int arr[], int start, int end){int len = end - start + 1;for(int i = 0; i < len; i++){for(int j = 0; j < len - i - 1; j++){if(arr[j] > arr[j + 1]){int tmp = arr[j];arr[j] = arr[j+1];arr[j+1] = tmp;}}}}//2. 插入排序://时间复杂度:最好O(n), 最坏O(n^2)//评价:稍快于冒泡//1.先认为第一个最小//2.第二个与第一个比较,如果第二个小,则交换。//3.第N次循环的时候,前面N个元素都是排好序的。static void standInsertSort(int arr[], int start, int end){int len = end - start + 1;for(int i = 1; i < len; i++){int tmp = arr[i];int j = -1;for(j = i - 1 ; j >= 0; j--){if(arr[j] > tmp){arr[j+1] = arr[j];}else{break;}}arr[j+1] = tmp;}}//3. 选择排序//时间复杂度:同插入排序,可能比冒泡快点,比插入慢点。//评价:无//1.找到最小的放在最前面//2.找到最小的放在第二位//3. ... ...static void selectSort(int arr[], int start, int end){int len = end - start + 1;int min = Integer.MAX_VALUE;for(int i = 0; i < len - 1; i++){//给arr按位赋值int mark = -1;for(int j = i; j < len; j++){//找出最小值if(arr[j] < min){min = arr[j];mark = j;}}arr[mark] = arr[i];arr[i] = min;//找到最小值min = Integer.MAX_VALUE;//重置min}}//4. 快速排序//时间复杂度:n(logn)//评价:比插入排序快static void quickSort(int arr[], int start, int end){int sStore = start, eStore = end;int len = end - start + 1;switch(len){case 0:case 1:return;case 2:arr[0] = arr[0]^arr[1];arr[1] = arr[0]^arr[1];arr[0] = arr[0]^arr[1];return;}int mark = arr[start];//需要从右面找一个比mark小的值来填充arr[start]//System.out.println("Sorts.quickSort() 时间复杂度为 " + len);while(start < end){while(arr[end] > mark && end > start){end--;}if(end > start){//找到了,则填充arr[start]arr[start] = arr[end];start++;//start值确定所以,加一。}else{//没有找到,这表示start右面的值全都比mark大了。。此时end == start,循环结束}//此时,arr[start]与arr[end]重复了。。需要从左面找一个比mark大的值来填充arr[end]。//方法同上while(arr[start] < mark&& end > start){start++;}if(end > start){//找到了,填充arr[end]arr[end] = arr[start];end--;//end值确定,所以减一。}else{//没找到,这表示start左面的值全部比mark小了。。}}//我们知道,每次按照算法计算一次循环之后,数组中都会出现2个相同的值,所以会缺少一个值,这个值就是mark。//因为我们从开头把mark提取之后,就没有把它赋回。//所以mark应该放哪呢?//因为循环结束只有一种可能,就是(start == end)这意味着什么?//意味着:start的左面全部比mark小,end的右面全部比mark大。//结果明确了吧。把start赋值成mark就恰好达到我们的要求了。arr[start] = mark;//至此,数组从0-->start的值,全部比start+1 --> end的值要小了。//果断递归quickSort(arr, sStore, start - 1);//之前写的不是start-1而是start,结果数据若超过65536会栈溢出。quickSort(arr, start+1, eStore);}//5. 堆排序//时间复杂度: n/2 + log(n) + log(n-1) + ...+ log1 ==> n(logn)static class heapSort{private static void swapArrayElement(int array[], int a, int b){if(a == b){return;}array[a] = array[a]^array[b];array[b] = array[a]^array[b];array[a] = array[a]^array[b];}private static void judgeHeap(int array[], int i, int len){//调整第i个元素为顶的3元大根堆int lChild = 2*i + 1;int rChild = 2*i + 2;if(lChild > len - 1){return;}if(rChild > len - 1){if(array[i] < array[lChild]){swapArrayElement(array, i, lChild);}return;}int max = i;if(array[i] < array[lChild]){max = lChild;}if(array[max] < array[rChild]){max = rChild;}if(max != i){swapArrayElement(array, max, i);judgeHeap(array, max, len);}}static void hSort(int array[], int from, int to) {int len = to - from + 1;if (len <= 1) {return;}for (int i = len - 1; i >= 0; i--) {//创建初始堆,从最后一个元素开始作为3元堆顶,//使其满足堆定义。这样总能把最大元素推到堆顶。judgeHeap(array, i, len);}for(int i = 0; i < len; i++){swapArrayElement(array, 0, len - i - 1);//把最大元素放到末尾。judgeHeap(array, 0, len - i - 1);//改变的元素可能不符合堆定义。}}}//6.归并//分治法//>如果问题缩小到一定规模可以很容易求解//>可以分解成相同的子问题//>问题可由子问题的结果合并而得出。(是否使用分治法,完全取决于此点)//>各个子问题之间是相互独立的,不包含公共子问题。(动态规划)//晕了 搞了好久。。这样是不是占用空间太大了阿。。fak//时间复杂度:n(logn)static class MergerSort{static void printArr(String tag, int arr[], int f, int to){}static int[] merge(int arr1[],int arr2[]){int l1 = arr1.length;int l2 = arr2.length;int re[] = new int[l1 + l2];int o = 0;int t = 0;for(int i = 0; i < re.length; i++){if(o > l1 - 1){re[i] = arr2[t];t++;}else if(t > l2 - 1){re[i] = arr1[o];o++;}else if(arr1[o] < arr2[t]){re[i] = arr1[o];o++;}else{re[i] = arr2[t];t++;}}return re;}static int [] mSort(int []arr, int from, int to){int len = to - from + 1;if(len == 1){return new int[]{arr[from]};}int mid = (from + to) / 2;int[] l = mSort(arr, from, mid);int[] r = mSort(arr, mid+1, to);return merge(l, r);}}// 7.希尔static void shellSort(int arr[], int from, int to) {int len = to - from + 1;if (len == 1) {return;}int d = len % 2 == 0 ? len / 2 : len / 2 + 1;while (d >= 1) {//下面是一个典型插入排序for (int i = d; i < len; i++) {int tmp = arr[i];int j = -1;for (j = i - d; j >= 0; j -= d) {if (arr[j] > tmp) {arr[j + d] = arr[j];} else {break;// !!}}arr[j + d] = tmp;// 因为最后一位}d = d % 2 == 0 || d == 1 ? d / 2 : d / 2 + 1;}}//8.基数//基数排序很厉害哇//时间复杂度: 2 * n * (最大的数的位数)static class RadixSort{private static class list{LinkedList<Integer> l = new LinkedList<Integer>();LinkedList<Integer> getL(){return l;}public list(){}void add(int value){l.add(value);}void clear(){l.clear();}int size(){return l.size();}}private static class lists{private static list []l = new list[10];static void reset(){//重置所有的桶for(int i = 0; i < l.length; i++){if(l[i] != null && l[i].size()!=0){l[i].clear();}if(l[i] == null){l[i] = new list();}}}static list get(int index){//得到一个桶return l[index];}static void set(int index, int value){//往某个桶中添加数据l[index].add(value);}}static void rSort(int arr[], int from, int to){int len = to - from + 1;if(len <= 1){return;}int times = 1;int currentTime = 0;int label = 1;while(currentTime < times){label = 10 * label;lists.reset();boolean timesMark = false;for(int i = 0; i < len; i++){//进桶int invalue = (arr[i]%label)/(label/10);//计算当前数放到哪个桶lists.set(invalue, arr[i]);if(!timesMark && arr[i]/label >= 1){//支持数值最大值为(9,9999,9999)否则。label超过Integer.MAX_VALUE会出错。times++;timesMark = true;}}int i = 0;for(int j = 0; j < 10; j++){for(Integer value: lists.get(j).getL()){arr[i] = value;i++;}}currentTime++;}}}public static void main(String[] args) {//测试int arr[] = {8, 91, 411, 2222, 33333, 744444, 6555555, 56666666,1010101010,1010101011, 15554444, 212112211,};//int arr[] = {81, 19, 44, 222, 323, 712, 56, 523, 15, 12,};System.out.println("Sorts.main() before");System.out.println(Arrays.toString(arr));//BubbleSort(arr, 0, arr.length - 1);//arr = insertSort(arr, 0, arr.length - 1);//arr = selectSort(arr, 0, arr.length - 1);//quickSort(arr, 0, arr.length - 1);
// heapSort.hSort(arr, 0, arr.length-1);//arr = MergerSort.mSort(arr, 0, arr.length-1);//standInsertSort(arr, 0, arr.length-1);//selectSort(arr, 0, arr.length-1);
// shellSort(arr, 0, arr.length-1);RadixSort.rSort(arr, 0, arr.length-1);System.out.println("Sorts.main() after");System.out.println(Arrays.toString(arr));int x[] = new int[8000000];for(int i = 0; i < x.length; i++){x[i] = (int)(Math.random()* (Integer.MAX_VALUE/100));}long currentTime = System.currentTimeMillis();System.out.println("Sorts.main() startTime = " + currentTime);//selectSort(x, 0, x.length - 1);//quickSort(x, 0, x.length - 1);//heapSort.hSort(x, 0, x.length - 1);
// MergerSort.mSort(x, 0, x.length-1);
// shellSort(x, 0, x.length-1);RadixSort.rSort(x, 0, x.length-1);//发现不如快速排序快。。估计是用了ArrayList的缘故。。System.out.println("Sorts.main() consumeTime = " + (System.currentTimeMillis() - currentTime));}
}
相关文章:

边界填充算法讲解_边界填充算法
边界填充算法讲解Boundary fill is the algorithm used frequently in computer graphics to fill a desired color inside a closed polygon having the same boundary color for all of its sides.边界填充是在计算机图形学中经常使用的算法,用于在其所有边都具有…

使用Git管理源代码
git是个了不起但却复杂的源代码管理系统。它能支持复杂的任务,却因此经常被认为太过复杂而不适用于简单的日常工作。让我们诚实一记吧:Git是复杂的,我们不要装作它不是。但我仍然会试图教会你用(我的)基本的Git和远程代…

[.Net跨平台]部署DTCMS到Jexus遇到的问题及解决思路---Linux环境搭建
最近朋友托我帮忙研究如何把一个DTCMS部署到Linux下,经过1天的研究,部署基本成功,可能有些细节还未注意到,现在把心得分享一下。过程比预期的要简单 身为.Net程序员,这个问题的第一步可能就是如何搭建一个Linux环境来测…

Sequence point 中文
摘自维基百科: In C[4] and C,[5] sequence points occur in the following places. (In C, overloaded operators act like functions, and thus operators that have been overloaded introduce sequence points in the same way as function calls.) Between ev…

python中pop函数_Python中的Pop函数
python中pop函数什么是弹出功能? (What is the pop function?) The method pop() removes and returns the last element from a list. There is an optional parameter which is the index of the element to be removed from the list. If no index is specified…

第六周学习进度条
日期 任务 听课 编程 阅读 准备考试 日总计 周日 周一 120 300 0 0 420 100 周二 0 120 0 0 120 周三 0 0 0 0 0 周四 0 0 0 0 0 周五 0 0 0 0 0 周六 0 120 100 0 …

1071. 小赌怡情(15)
常言道“小赌怡情”。这是一个很简单的小游戏:首先由计算机给出第一个整数;然后玩家下注赌第二个整数将会比第一个数大还是小;玩家下注t个筹码后,计算机给出第二个数。若玩家猜对了,则系统奖励玩家t个筹码;…

关于年长程序员的5个误传
原文链接:http://kb.cnblogs.com/page/150932/ 英文原文:Five Pervasive Myths About Older Software Developers 最近我刚过完40岁生日,一个朋友向我开玩笑地说“嘿,你已经老了,不适合做程序员了!”我虽然…

java中getter_Java中的Getter和Setters解释了
java中getterGetters and setters are used to protect your data, particularly when creating classes. Getter和Setter用于保护数据,尤其是在创建类时。 For each instance variable, a getter method returns its value while a setter method sets or updates…

Loadrunner手动关联详解
Loadrunner手动关联详解 一、关联的含义: 关联(correlation):在脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服务器所响应的内容中…

解决Visual Studio禁止使用strlen函数的问题
问题描述: 在学习C的复制构造函数以及复制赋值运算符的重载时,需要用到使用C风格的字符串作为引入,由于我用的是VS2015(社区版),在编译时出错。编译器提醒strcpy函数是不安全的,建议改用strlen_…

求整型数组所有子串的和中的最大值
#include <iostream> using namespace std;const int MIN_INT -2147483647;int maxSum(const int *arr, int len){int my_max MIN_INT;int tmp 0;for(int i 0; i < len; i){//从头到尾。。tmp arr[i];//遍历相加。if(my_max < tmp){//更新my_maxmy_max tmp;}…

c语言中的if语句_If ... C中的其他语句解释
c语言中的if语句Conditional code flow is the ability to change the way a piece of code behaves based on certain conditions. In such situations you can use if statements.条件代码流是根据某些条件更改一段代码的行为的能力。 在这种情况下,可以使用if语句…

设计模式之笔记--装饰模式(Decorator)
装饰模式(Decorator) 定义 装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。 类图 描述 Component:被装饰者和装饰者共有的基…

整型数组负数放左面,其他放右面,要求时空复杂度:O(n), O(1)。
例如:处理前:{5 -3 6 -7 -6 1 8 -4 0 0},处理后:{-3 -7 -6 -4 5 6 1 8 0 0}. #include <iostream> #include <algorithm> using namespace std;const int LEN 10; void printInt(int c){cout<<c<<"…

[bzoj] 1176 Mokia || CDQ分治
原题 给出WW的矩阵(S没有用,题目有误),给出无限次操作,每次操作的含义为: 输入1:你需要把(x,y)(第x行第y列)的格子权值增加a 输入2:你需要求出以左下角为(x1,y1),右上角为(x2,y2)的矩阵内所有格子的权值和,…

sql子查询示例_SQL更新查询示例说明
sql子查询示例In this article, were going to learn how to use the SQL update statement - what it is, what it can do, and what you need to be aware of before using it.在本文中,我们将学习如何使用SQL更新语句-它是什么,它可以做什么以及在使用…

keepalived+nginx安装
安装keepalivednginx做为公司服务器前端高可用反向代理安装nginx 1、yum install -y pcre pcre-devel gcc-c zlib zlib-devel openssl openssl-devel 2、cd /usr/local/soft 3、wget http://nginx.org/download/nginx-1.12.2.tar.gz 4、tar -zxvf nginx-1.12.2.tar.gz 5、cd ng…

Nexus Repository Manager 3.0 发布
著名仓库管理工具Nexus,在2016年4月6日发布3.0版本(包括OSS版),相较2.*版本有很大的改变: 1. 从底层重构,从而提高性能,增强扩展能力,并改善用户体验 2. 升级界面,增加更…

计算整型数的二进制中包含多少个1
方法很多啊,比如://1.靠循环: int calculate(unsigned int n){int count 0;unsigned int mark 0x1;for(int i 0; i < 32; i){if(n&mark){count;mark<<1;}}return count; }//2. 据说不用循环就能算出来的牛叉方法。木有测试。…

nvm npm不是内部命令_npm作弊表-最常见的命令和nvm
nvm npm不是内部命令npm or the Node Package Manager, is one of the most used tools for any Node.js developer. Heres a list of the most common commands youll use when working with npm.npm或Node Package Manager是Node.js开发人员最常用的工具之一。 这是使用npm时…

快速排序的实现与注意点
先上实现了的C代码: 1 #include <ctime>2 #include <cstdio>3 #include <cstdlib>4 #include <iostream>5 using namespace std;6 const int maxn 100;7 int a[maxn], n;8 void quick_sort(int left, int right) {9 if(left > …

iOS 线程之GCD的高级使用方法
之前的一篇关于线程的blog已经为大家介绍了GCD的简单使用方式及样例说明,今天因为项目中有特殊的应用GCD的实例,为大家介绍两种特殊需求的使用GCD的方法。 目的:实现一件事情做完,再做下一件事情。确保函数的运行周期。 解决方式…

构造次优查找树
似乎有些错误,但是错在哪了呢? #include <iostream> #include <cmath> using namespace std;const int NUM 9;int value[NUM] {1,2,3,4,5,6,7,8,9}; float weight[NUM] {1,1,2,5,3,4,4,3,5}; float sum_weight[NUM]; void init_sum_weigh…

同步等待 异步等待_异步/等待和承诺的解释
同步等待 异步等待The async / await operators make it easier to implement many async Promises. They also allow engineers to write clearer, more succinct, testable code.async / await 运算符使实现许多异步Promises变得更加容易。 它们还允许工程师编写更清晰&#…

使用 GDB 调试多进程程序
使用 GDB 调试多进程程序 来源 https://www.ibm.com/developerworks/cn/linux/l-cn-gdbmp/index.html GDB 是 linux 系统上常用的 c/c 调试工具,功能十分强大。对于较为复杂的系统,比如多进程系统,如何使用 GDB 调试呢?考虑下面这…

理解Lucene索引与搜索过程中的核心类
理解索引过程中的核心类 执行简单索引的时候需要用的类有: IndexWriter、Directory、Analyzer、Document、Field 1、IndexWriter IndexWriter(写索引)是索引过程的核心组件,这个类负责创建新的索引,或者打开已有的索引…

lua的table+setfenv+setmetatable陷阱
--file1.lua x funciton() print("this is x") end ------------- --file2.lua local t {} local _G _G setfenv(1,t) --设置了这个之后,只要是在本文件中对未声明变量的访问,全部会导致递归。 _G.setmetatable(t, { __index fu…

rest api_REST API
rest api历史 (History) REST stands for Representational State Transfer protocol. Roy Fielding defined REST in his PhD dissertation in 2000.REST代表再表象小号泰特贸易交接协议。 Roy Fielding在2000年的博士学位论文中定义了REST。 什么是REST API? (Wh…

0414复利计算6.0--结对
结对同伴:姓名:柯晓君学号:201406114210博客园地址:http://www.cnblogs.com/950525kxj/一、项目简介 开发工具:eclipse 开发语言:java 主要功能:复利单利的计算、贷款的计算以及投资运算三大功能…