算法系列(三)插入排序的两种改进:规避边界检测和取消交换(Java实现)
来源:互联网 发布:童装网络营销策划书 编辑:程序博客网 时间:2024/05/17 08:27
前言:算法第四版习题2.1.24插入排序的哨兵和习题2.1.25不需要交换的插入排序
规避边界检测:
在插入排序的实现中先找到最小的元素并将其置于数组的第一个位置,可以省掉内循环的判断条件 j>0 。能够省略判断条件的元素称为哨兵。
public class Exer24 {public static void sort(Comparable[] a){int N = a.length;for (int i = N-1; i > 0; i--) {if(less(a[i],a[i-1]))exch(a,i,i-1);}for (int i = 2; i < N; i++) {for (int j = i; /*j > 0 && */less(a[j],a[j-1]); j--) {exch(a,j,j-1);}}}private static boolean less(Comparable v, Comparable w){ //比较v是否小于wreturn v.compareTo(w) < 0;}private static void exch(Comparable[] a, int i, int j) { //交换Comparable t = a[i];a[i] = a[j];a[j] = t;}public static void show(Comparable[] a){ //单行打印数组for (int i = 0; i < a.length; i++) {System.out.print(a[i] + " ");}System.out.println();}public static boolean isSorted(Comparable[] a){ //判断是否有序for (int i = 1; i < a.length; i++) {if(less(a[i], a[i-1]))return false;}return true;}}不需要交换:
使较大元素右移一位只需要访问一次数组,而使用交换需要访问两次。
public class Exer25 {public static void sort(Comparable[] a){int N = a.length;for (int i = 2; i < N; i++) {Comparable t = a[i];int j = i;for (; j > 0 && less(t, a[j-1]); j--) {a[j] = a[j-1]; //大的右移}a[j] = t;}}private static boolean less(Comparable v, Comparable w){ //比较v是否小于wreturn v.compareTo(w) < 0;}private static void exch(Comparable[] a, int i, int j) { //交换Comparable t = a[i];a[i] = a[j];a[j] = t;}public static void show(Comparable[] a){ //单行打印数组for (int i = 0; i < a.length; i++) {System.out.print(a[i] + " ");}System.out.println();}public static boolean isSorted(Comparable[] a){ //判断是否有序for (int i = 1; i < a.length; i++) {if(less(a[i], a[i-1]))return false;}return true;}}总结:写出正确的算法是首要的,改进是第二步。通过简单的代码改进算法的效率是一种优雅的行为。
阅读全文
1 0
- 算法系列(三)插入排序的两种改进:规避边界检测和取消交换(Java实现)
- 算法系列(二)冒泡排序、选择排序、插入排序和希尔排序(Java实现)
- 排序算法(三)——插入排序及改进
- 排序算法(三)——插入排序及改进
- 排序算法(三)——插入排序及改进
- 排序算法(一):冒泡算法的两种基本实现及改进
- [排序算法]--直接插入排序的三种实现(Java)
- 排序算法(三):JAVA实现直接插入排序
- 算法系列(三)排序算法上篇--冒泡排序插入排序和选择排序
- java排序的两种方法(数组排序)冒泡法和冒泡改进法
- 算法:两种算法相比较(选择和插入排序)
- 详谈排序算法之交换类排序(两种方法实现快速排序【思路一致】)
- 排序算法--插入排序(直接插入排序、折半插入、shell排序)的java实现
- 浅谈排序算法实现(冒泡、交换、插入、快速)
- 希尔排序(插入排序的改进)C++实现
- 改进排序算法:希尔排序(对直接插入排序的改进)
- java实现排序算法之交换排序(冒泡排序和快速排序)
- java算法之三快速排序(交换排序)
- 短信验证码的实现--基于Mob3.0 SMS SDK + Android Studio 2.3.3
- 三、缓冲输入输出
- CSS margin 属性
- python进程间通信
- 深入理解 Session 与 Cookie
- 算法系列(三)插入排序的两种改进:规避边界检测和取消交换(Java实现)
- UE4中灯光和天空大气的设置说明
- HTTP协议
- 海量数据处理面试题(1) 找出两文件种包含的相同的url
- 378. Kth Smallest Element in a Sorted Matrix (二分)
- Java虚拟机类加载的过程
- 机器学习系统设计(1)——第一个机器学习应用
- 排序算法——堆排序
- 大数取模:一般取模+技巧取模+快速幂取模+欧拉函数(费马小定理)