排序算法笔记_____2(选择排序和插入排序)
来源:互联网 发布:linux下解压rpm文件 编辑:程序博客网 时间:2024/06/05 03:28
选择排序
package com.chapter_two;/*** * 选择排序的思想: * * 在所有的元素中找出最小的元素,与数组的第一个元素进行交换, * * 再在剩下的元素中找出最小的元素,与数组的第二个元素进行交换, * * 如此往复,最终使整个数组有序。 * * 特点: * * ①运行时间和输入无关 ②相比其他排序算法,数据移动是最小的 * * 命题: * * 对于数组长度为 N 的数组,交换的次数为 N 次,比较次数大约为 N*N/2 次 * * @author LuodiJack */public class Selection { public static void sort(Comparable[] a) { int N = a.length; for (int i = 0; i < N; i++) {// 升序排列 int min = i; for (int j = i + 1; j < N; j++) { if (Template.less(a[j], a[min])) {// 找出最小的元素 min = j; } } Template.exch(a, min, i);// 交换元素 } } // less()、exch()见排序算法类的模板 public static void main(String[] args) { Integer[] a = { 11, 7, 3, 6, 8, 9, 2, 10 }; sort(a); for (Integer i : a) { System.out.print(i+" "); } }}
插入排序
package com.chapter_two;/*** * 思想: * * 通常人们整理桥牌的方法是一张一张的来, * * 将每一张牌插入到其他已经有序的牌中的适当位置。 * * 在计算机的实现中们为了给要插入的元素腾出空间,我们需要将其余的所有元素在插入之前都向右移动一位。 * * 时间: * * 插入排序所需要的时间取决于输入中元素的初始顺序。 * * 事实上,当数组中的倒置的元素的数量很少时,插入排序的速度还是很快的。 * * 另外,插入排序对部分有序数组很有效。 * * ( * 几个典型的部分有序数组: * * 一、数组中每个元素距离它的最终位置都不远 * * 二、一个有序的大数组接一个小数组 * * 三、数组中只有几个元素的位置不正确。 * ) * * @author LuodiJack * */public class Insertion { public static void sort(Comparable[] a) {// 升序排列 for (int i = 1; i < a.length; i++) { for (int j = i; j > 0 && Template.less(a[j], a[j - 1]); j--) {//内循环为交换两个元素 Template.exch(a, j, j - 1); } } } public static void sortTwo(Comparable[] a) {//升序排列 for (int i = 1; i < a.length; i++) { Comparable num = a[i]; int j = i; //内循环:将较大的元素向右移而不是交换两个元素,这样做的目的可以提高插入排序的速度(访问数组的次数减半)。 for (j = i; j > 0; j--) { if (Template.less(num, a[j - 1])) { a[j] = a[j - 1]; } else { break; } } a[j] = num; ; } } @SuppressWarnings("rawtypes") public static void sortThree(Comparable[] a) {// 升序排列 // 先将最小的元素移到 a[0] 处,起哨兵的作用, // 可以将内循环中的 j>0 的条件去掉,减少了交换次数,经过测试 可知, 这种做法确实缩短了运行时间 int indexOfMin = 0; for (int i = 1; i < a.length; i++) { if (Template.less(a[i], a[indexOfMin])) { indexOfMin = i; } } Template.exch(a, 0, indexOfMin); for (int i = 1; i < a.length; i++) { for (int j = i; Template.less(a[j], a[j - 1]); j--) { Template.exch(a, j, j - 1); } } }}
两种插入排序的测试:
用随机函数随机生成一百万个数字赋值给两个数组,分别用两种插入排序进行排序,并记下各自的运行时间。sort()运行了7903554ms,sortTwo()运行了6799631ms,两者相差1103923ms(约18分钟)。看见没,这就是差距(随后进行了许多次试验,都验证了sortTwo() 比sort()快)。
但是,当所有的元素都相等时,即所有主键都一样的时候,第二种排序方法就比第一种慢了很多。
文中用到的less()、exch()方法,详见类模板。(排序算法笔记____1)
http://blog.csdn.net/a199581/article/details/50651401
0 0
- 排序算法笔记_____2(选择排序和插入排序)
- 算法学习--选择排序和插入排序
- 排序算法之二-选择排序和插入排序
- 排序算法-选择排序和插入排序比较(待续未完)
- 插入排序、选择排序和快速排序的算法实现
- 排序算法之选择排序和插入排序
- 【算法】插入排序/冒泡排序/选择排序
- 数据结构--排序算法(插入排序&&选择排序)
- 《算法》选择排序、插入排序、冒泡排序
- 插入排序和选择排序
- 选择排序和插入排序
- 选择排序和插入排序
- 选择排序和插入排序
- 选择排序和插入排序
- 插入排序和选择排序
- 选择排序和插入排序
- 插入排序和选择排序
- 选择排序和插入排序
- Java多线程通过多核CPU来提升速度--更快的执行
- [剑指offer-1518]反转链表
- JAVA的BigInteger
- 解决win10下WIFI无法连接到网络
- neuq oj 1016 Roliygu and Yilan C++
- 排序算法笔记_____2(选择排序和插入排序)
- swift算法手记-10
- 最大二分匹配
- 微信支付之HTML5页面WAP端接入
- Educational Codeforces Round 7 A. Infinite Sequence
- 冒泡 随机数
- Educational Codeforces Round 7 B. The Time
- 开发web面试
- [Spring实战系列](16)面向切面编程(AOP)概述