- 浏览: 1111107 次
文章分类
- 全部博客 (379)
- S2SH (16)
- stuts2 (0)
- java语言 (81)
- JSP (17)
- <html>元素 (11)
- javaweb (4)
- web容器 (3)
- ext (23)
- javaScript (48)
- ant (1)
- liferay (1)
- sql (9)
- css (42)
- 浏览器设置 (3)
- office_world (1)
- eclipse (4)
- 其它 (28)
- 操作系统 (5)
- android (6)
- Struts2 (11)
- RegEx (3)
- mysql (5)
- BigDATA (1)
- Node.js (1)
- Algorithm (10)
- Apache Spark (1)
- 数据库 (5)
- linux (2)
- git (1)
- Adobe (3)
- java语言,WebSocket (1)
- Maven (3)
- SHELL (1)
- XML (2)
- 数学 (2)
- Python (2)
- Java_mysql (1)
- ReactJS (6)
- 养生 (4)
- Docker (1)
- Protocols (3)
- java8 (2)
- 书籍 (1)
- Gradle (2)
- AngularJS (5)
- SpringMVC (2)
- SOAP (1)
- BootstrapCSS (1)
- HTTP协议 (1)
- OAuth2 (1)
最新评论
-
Lixh1986:
Java并发编程:自己动手写一把可重入锁https://blo ...
Java之多线程之Lock与Condition -
Lixh1986:
http://win.51apps.com.cn/https: ...
temp -
ztwsl:
不错,支持很好
HttpServletRequest和ServletRequest的区别 -
guodongkai:
谢谢您能将知识精华汇编总结,让初学者们从原理中学会和提高。
javaScript之function定义 -
kangwen23:
谢谢了,顶顶
struts2中的ValueStack学习
对大小是 60000 的数组进行排序
执行结果(毫秒):
/*
* Creating arrays uses time: 16
* 冒泡排序: 4651
* 插入排序: 1465
* 选择排序: 1399
* 快速排序: 14
*/
代码:
另附:快速排序执行过程分析
引用:
https://zh.wikipedia.org/wiki/冒泡排序
https://zh.wikipedia.org/wiki/插入排序
https://zh.wikipedia.org/wiki/选择排序
https://zh.wikipedia.org/wiki/快速排序
-
转载请注明
原文出处: http://lixh1986.iteye.com/blog/2322727
-
执行结果(毫秒):
/*
* Creating arrays uses time: 16
* 冒泡排序: 4651
* 插入排序: 1465
* 选择排序: 1399
* 快速排序: 14
*/
代码:
package test; public class T{ public static void main(String[] args) { long start = System.currentTimeMillis(); int[] arr1 = createArray(); int[] arr2 = createArray(); int[] arr3 = createArray(); int[] arr4 = createArray(); quick_sort qs = new quick_sort(); long end = System.currentTimeMillis(); System.out.println("Creating arrays uses time: " + (end - start)); start = System.currentTimeMillis(); bubble_sort(arr1); end = System.currentTimeMillis(); System.out.println("冒泡排序: " + (end - start)); start = System.currentTimeMillis(); insertion_sort(arr3); end = System.currentTimeMillis(); System.out.println("插入排序: " + (end - start)); start = System.currentTimeMillis(); selection_sort(arr2); end = System.currentTimeMillis(); System.out.println("选择排序: " + (end - start)); start = System.currentTimeMillis(); qs.sort(arr4); end = System.currentTimeMillis(); System.out.println("快速排序: " + (end - start)); /* * Creating arrays uses time: 16 * 冒泡排序: 4651 * 插入排序: 1465 * 选择排序: 1399 * 快速排序: 14 */ } public static int[] createArray() { int length = 60000; int[] arr = new int[length]; int i = 0; for (; i < length; i++) { arr[i] = (int) (Math.random() * length); } return arr; } /** * 冒泡排序: * * 一、 重复的遍历要排序的序列 n 次。(n为数组的长度) * 二、 对于每次遍历: * 2.1 要遍历的元素个数减 1 (因为尾部的已经排好) * 2.2 每次都要比较两个元素。如果符合条件,则交换位置。 */ public static void bubble_sort(int[] arr) { int i, j, temp, len = arr.length; // 1. 遍历 i 次 for (i = 0; i < len - 1; i++) // 2. 对于 0 到 len-i 中的元素 for (j = 0; j < len - 1 - i; j++) // 3. 如果前面的大,则交换(冒泡)到后面 if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } /** * 插入排序: * * 一、从数组的第1个元素开始遍历至第n个。(n为数组的长度) * 二、对于每一个遍历到的元素: * 2.1 向前倒着找(已经排好序的)自己的位置。 * 2.2 如果不符合条件,则前面的元素向后移动,与之交互位置。 * 直至条件符合。 */ public static void insertion_sort(int[] arr) { for (int i = 0; i < arr.length - 1; i++) { // 1. 遍历每一个 i for (int j = i + 1; j > 0; j--) { // 2. 从 0-j 是已经排序好的。 if (arr[j - 1] <= arr[j]) break; // 位置已经找到,不用再比了。继续下一个 i // 对于每一个 i,向后移动每一个j,腾出空间。直至找到 i 的位置。 int temp = arr[j]; arr[j] = arr[j - 1]; arr[j - 1] = temp; } } } /** * 选择排序: * * 一、遍历从 0 到 n 个位置。(n为数组的长度) * 二、对于每一个位置: * 2.1 从剩余的数中找到符合条件的,放到该位置上。 */ public static void selection_sort(int[] arr) { int i, j, min, temp, len = arr.length; // 1. 遍历每一个 位置 i for (i = 0; i < len - 1; i++) { min = i; for (j = i + 1; j < len; j++) // 2. 遍历每一个 j,找出最小的 if (arr[min] > arr[j]) min = j; // 3. 把 找出的值放在 i 的位置 temp = arr[min]; arr[min] = arr[i]; arr[i] = temp; } } } /** * 快速排序(Quicksort): * 又称为划分交换排序(partition-exchange sort) * * 快速排序使用分治法(Divide and conquer)策略來把一个序列(list)分为两个子序列(sub-lists)。 * 步骤: * 1. 从序列中选一个数作为基准(pivot)。【本例中使用最后一个元素】 * 2. 分别从左右两侧开始向中间推进。 * 左侧:从左至右前进,直至找到大于等于基准的数。 * 右侧:从右至左前进,直至找到小于基准的数。 * 左右两个数调换位置。 * 3. 重复2的过程,直至左右相碰,全部遍历完一遍。 * 此时在相碰处: * 左侧:所有的数都小于基准小。 * 右侧:所有的数都大于或等于基准。 * 中间:基准元素的位置已确定了。 * 4. 把相碰处分为两个子序列,递归的调用2,3步骤。 */ class quick_sort { int[] arr; private void swap(int x, int y) { int temp = arr[x]; arr[x] = arr[y]; arr[y] = temp; } private void quick_sort_recursive(int start, int end) { if (start >= end) return; int mid = arr[end]; int left = start, right = end - 1; //1. left 区先和 right 区比 while (left < right) { while (arr[left] < mid && left < right) // 找到left中比mid大的或相等的。 left++; while (arr[right] >= mid && left < right) // 只找到right中比mid小的。 right--; if(left < right) swap(left, right);// 将2个的位置调换。 } //2. left 区再和 mid 比 // 如果左侧最右边(右侧最左边)的值比mid大, // 则mid要归小值区。 left的值不加。 // 即保证:left 区的值都是小的。 if (arr[left] >= arr[end]) swap(left, end); else left++; // left 此时为中间值,位置已被最终确定。无需包含 left。 // 故从 left-1, left + 1 开始。 quick_sort_recursive(start, left - 1); quick_sort_recursive(left + 1, end); } public void sort(int[] arrin) { arr = arrin; quick_sort_recursive(0, arr.length - 1); } }
另附:快速排序执行过程分析
package test; public class T { public static void main(String[] args) { // 快速排序使用最后一个元素作为基准, // 对于最坏的情况: int[] arr = new int[] {2,3,4,5,6,7,1}; quick_sort qs = new quick_sort(); qs.sort(arr); /* * * 1 - [ 1, 3, 4, 5, 6, 7, 2 ] * 2 - [ 1, 2, 4, 5, 6, 7, 3 ] * 3 - [ 1, 2, 3, 5, 6, 7, 4 ] * 4 - [ 1, 2, 3, 4, 6, 7, 5 ] * 5 - [ 1, 2, 3, 4, 5, 7, 6 ] * 6 - [ 1, 2, 3, 4, 5, 6, 7 ] */ } static class quick_sort { int[] arr; private void printArray(){ String str = "[ "; int i = 0; for (;i<arr.length;i++){ str += arr[i] + ", "; } str = str.substring(0, str.length() - 2) + " ]"; System.out.println(str); } private void swap(int x, int y) { int temp = arr[x]; arr[x] = arr[y]; arr[y] = temp; } private void quick_sort_recursive(int start, int end) { if (start >= end) return; int mid = arr[end]; int left = start, right = end - 1; while (left < right) { while (arr[left] < mid && left < right) left++; while (arr[right] >= mid && left < right) right--; swap(left, right); } if (arr[left] >= arr[end]) swap(left, end); else left++; printArray(); quick_sort_recursive(start, left - 1); quick_sort_recursive(left + 1, end); } public void sort(int[] arrin) { arr = arrin; quick_sort_recursive(0, arr.length - 1); } } }
引用:
https://zh.wikipedia.org/wiki/冒泡排序
https://zh.wikipedia.org/wiki/插入排序
https://zh.wikipedia.org/wiki/选择排序
https://zh.wikipedia.org/wiki/快速排序
-
转载请注明
原文出处: http://lixh1986.iteye.com/blog/2322727
-
发表评论
-
java 将文件夹所有的文件合并到指定的文件夹下
2020-06-30 19:17 1055场景:将文件夹所有的文件合并到指定的文件夹下 另外:如果想效 ... -
多线程-线程池的四种创建方式
2020-04-01 18:38 481多线程-线程池的四种创建方式 https://blog.cs ... -
Java基础之:nio
2019-11-13 15:38 477一、理论讲解: 史上最强Java NIO入门:担心从入门到放弃 ... -
Java 分布式之:RPC 基本概念
2019-11-13 15:07 454转载: https://www.jianshu.com/p/ ... -
Java之 volatile 关键字原理详解
2019-11-07 15:36 543一、什么是 volatile ? ... -
POI实现excell批注背景图片(仿html浮窗显示图片)
2019-10-21 08:17 683POI实现excell批注背景图片(仿html浮窗显示图片) ... -
Java之设计模式之 Observer 观察者
2019-07-04 17:21 1063观察者设计模式 Java 已经实现了该模式,并且提供了使用类 ... -
HashMap, LinkedHashMap and TreeMap
2019-03-01 11:04 673https://stackoverflow.com/a/177 ... -
Java lib 操作 excel 插入图片
2019-01-19 12:46 879https://poi.apache.org/componen ... -
数据库连接池C3P0
2018-05-29 16:50 890一、名字的由来 很多 ... -
Java8之集合(Collection)遍历 forEach()、stream()
2018-05-29 14:39 20744package java8.collections; ... -
Junit Vs main on "java.util.concurrent.Executors"
2017-11-10 16:44 808Same code with different result ... -
Java之大数据学习路线
2017-11-03 10:08 5720三个月大数据研发学习 ... -
Java中创建对象的5种方式
2017-10-26 14:21 839一、Java之5种创建对象的方式 ————————————— ... -
Log4j和Slf4j的比较
2017-06-23 12:41 1406一直搞不清 Log4j 和 SLF4j 的关系。今天才若有所 ... -
Java之Java7新特性之try资源句式
2017-04-20 14:58 5384Java之Java7新特性之try资源句式 一、【try资源 ... -
Java之 java.util.concurrent 包之ExecutorService之submit () 之 Future
2017-03-04 21:27 3834一、如何使用 ExecutorService.submit() ... -
Java之 java.util.concurrent 包之Executor与ExecutorService
2017-03-04 21:18 2702一、问题: execute() 与 submit() 的区别? ... -
JAVAEE之单用户登录
2017-02-05 11:55 1058单用户登录是系统中数据一直性的解决方案之一。 问题背景: 试 ... -
Java之多线程之线程池之线程重复使用
2017-02-04 13:33 5565一、问题背景 在使用多线程时,如果要开启一个任务,则就需要新 ...
相关推荐
本话题主要探讨六种内部排序算法:直接插入排序、希尔排序、冒泡排序、快速排序、选择排序以及堆排序。这六种排序算法各有优劣,适用于不同的场景,接下来我们将逐一进行详细阐述。 1. **直接插入排序**: 直接...
本文将深入探讨C#中实现的四种经典排序算法:冒泡排序、选择排序、插入排序和希尔排序。每种算法都有其特定的应用场景和性能特点,理解它们的工作原理对于提升编程技能和优化代码效率至关重要。 首先,我们来看**...
十个基础排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、桶排序、计数排_SortAlgorithm
本文将深入探讨Java编程语言中实现的七种主要排序算法:直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序以及归并排序。每种算法都有其独特性,适用于不同的场景和数据特性。 1. **直接插入排序**:...
本篇文章将深入探讨九种常见的排序算法:冒泡排序、桶排序、计数排序、堆排序、插入排序、合并排序、快速排序、基数排序以及选择排序,并以C语言实现为例。 1. **冒泡排序**: 冒泡排序是一种简单的排序算法,通过...
Python实现常见的排序算法:冒泡排序、快速排序、简单插入排序、希尔排序、归并排序、基数排序、直接_SortAlgorithm
总的来说,这段代码提供了四种排序算法的实现,分别是冒泡排序、选择排序、插入排序以及Java内置的数组排序。每种排序算法都有其适用场景,理解这些算法可以帮助我们更好地解决实际问题,并根据需求选择合适的排序...
本篇文章将深入探讨标题和描述中提到的九大排序算法:快速排序、冒泡排序、堆排序、希尔排序、直接插入排序、直接选择排序、基数排序、箱排序和桶排序。 1. **快速排序**:快速排序是一种基于分治策略的排序算法,...
1. **冒泡排序**:这是一种简单的排序算法,通过重复遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。冒泡...
排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序.mht
本文将深入探讨四种在C++中实现的常见排序算法:插入排序、冒泡排序、堆排序和快速排序。这些算法各有特点,适用于不同的场景,理解并掌握它们对于提升编程能力至关重要。 1. **插入排序**: 插入排序是一种简单的...
排序算法汇总P: 冒泡排序快速排序直接选择排序插入排序希尔排序 堆排序........
算法基础:冒泡排序;直接插入排序;希尔排序;快速排序;堆排序;归并排序;基数排序_Algorithm
java实现10种排序算法:选择排序、冒泡排序、插入排序、快速排序、归并排序、堆排序、希尔排序、桶排_sorting-algorithms
本资源提供了七大经典排序算法的实现程序,包括快速排序、冒泡排序、选择排序、归并排序、插入排序、希尔排序和堆排序。下面将逐一详细介绍这些排序算法及其原理。 1. 快速排序:由C.A.R. Hoare提出,是一种采用...
八种常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排_EightAlgorithms
希尔排序的时间复杂度通常比插入排序要好,但不如其他更高效的排序算法,如快速排序或归并排序。 3. **冒泡排序**: 冒泡排序是一种直观的排序算法,通过不断交换相邻的逆序元素来逐渐排序整个数组。在每一轮迭代...