java 实现七大基本排序算法
一、 选择排序
/**
* 选择排序: int arr[] = { 5, 6, 2, 7, 8, 6, 4 };
*
* 第0趟
5 2 6 7 6 4 8
第1趟
2 5 6 6 4 7 8
第2趟
2 5 6 4 6 7 8
第3趟
2 5 4 6 6 7 8
第4趟
2 4 5 6 6 7 8
第5趟
2 4 5 6 6 7 8
第6趟
2 4 5 6 6 7 8
*/
public void selectSorted(int arr[]) { int n = arr.length;
for (int i = 0; i < n; i++) { for (int j = 0; j < n - 1; j++) { if (arr[j + 1] < arr[j])
swap(arr, j, j + 1);
}
System.out.println("\n" + "第" + i + "趟");
printArray(arr);
}
}
二、插入排序
/**
* 插入排序 : int arr[] = { 5, 6, 2, 7, 8, 6, 4 };
* 第1趟
5 6 2 7 8 6 4
第2趟
2 5 6 7 8 6 4
第3趟
2 5 6 7 8 6 4
第4趟
2 5 6 7 8 6 4
第5趟
2 5 6 6 7 8 4
第6趟
2 4 5 6 6 7 8
*/
public void insertSorted(int arr[]) { int n = arr.length; for (int i = 1; i < n; i++) { for (int j = i; j > 0; j--) { if (arr[j] < arr[j - 1])
swap (arr,j, j - 1);
}
System.out.println("\n" + "第" + i + "趟");
printArray(arr);
} } // 效率更优,减少不必要的交换
public void insertSorted2(int arr[]) { int n = arr.length; for (int i = 1; i < n; i++) { int ele = arr[i]; // 当前待比较的元素
int j; // 当前元素最终的下标位置
for (j = i; j > 0 && arr[j - 1] > ele; j--)
arr[j] = arr[j - 1];
arr[j] = ele; System.out.println("\n" + "第" + i + "趟");
printArray(arr);
}
}
三、冒泡排序
/**
* 冒泡排序 : int arr[] = { 5, 6, 2, 7, 8, 6, 4 };
*
* 第0趟
5 2 6 7 6 4 8
第1趟
2 5 6 6 4 7 8
第2趟
2 5 6 4 6 7 8
第3趟
2 5 4 6 6 7 8
第4趟
2 4 5 6 6 7 8
第5趟
2 4 5 6 6 7 8
第6趟
2 4 5 6 6 7 8
*/
public void bubbleSorted(int arr[]) { int n = arr.length; for (int i = 0; i < n; i++) { for (int j = 0; j < n - i - 1; j++)
if ( arr[j] > arr[j + 1])
swap(arr, j, j + 1); System.out.println("\n" + "第" + i + "趟");
printArray(arr); }
}
四、归并排序
/**
* 归并排序 :
4 5 2 7 1 6 3
4 5 2 7 1 6 3
2 4 5 7 1 6 3
2 4 5 7 1 6 3
2 4 5 7 1 3 6
1 2 3 4 5 6 7
*/
public void mergeSorted(int arr[]) { int n = arr.length - 1; // 闭区间
splitArray(arr, 0, n); } private void splitArray(int[] arr, int L, int R) { if (L >= R) {
return;
} int mid = L + (R - L) / 2; splitArray(arr, L, mid);
splitArray(arr, mid + 1, R); // merge(arr, L, mid, R); // 优化
if (arr[mid] > arr[mid + 1])
merge(arr, L, mid, R); printArray(arr);
System.out.println(); } private void merge(int[] arr, int L, int mid, int R) { int aux[] = new int[R - L + 1]; for (int i = L; i <= R; i++) { aux[i - L] = arr[i];
} int i = L;
int j = mid + 1; for (int k = L; k <= R; k++) { if (i > mid) {
arr[k] = aux[j - L];
j++;
} else if (j > R) {
arr[k] = aux[i - L];
i++;
} else if (aux[i - L] < aux[j - L]) {
arr[k] = aux[i - L];
i++;
} else if (aux[i - L] > aux[j - L]) {
arr[k] = aux[j - L];
j++;
} else { // 相等情况,
arr[k] = aux[j - L];
j++;
} }
}
五、快速排序
/**
* 快速排序
*/
public void quickSorted(int arr[]) { int n = arr.length - 1; quickSorted(arr, 0, n);
} private void quickSorted(int[] arr, int L, int R) { if (L >= R)
return; // 单路
// int p1 = partioner(arr, L, R);
//
// quickSorted(arr, L, p1 - 1);
// quickSorted(arr, p1 + 1, R); // 双路
int p2 = partioner2(arr, L, R); quickSorted(arr, L, p2 - 1);
quickSorted(arr, p2 + 1, R);
} // 单路
private int partioner(int[] arr, int L, int R) { int v = arr[L];
int j = L; for (int i = j + 1; i <= R; i++) { if (arr[i] < v) {
swap(arr, i, j + 1);
j++; }
}
swap(arr, j, L); return j;
} // 双路
private int partioner2(int[] arr, int L, int R) { int v = arr[L]; int j = L + 1;
int k = R; while (true) { while (j <= R && arr[j] < v)
j++;
while (k >= L + 1 && arr[k] > v)
k--;
if (k < j)
break; swap(arr, j, k); } swap(arr, L, k); return k;
} // 三路
public void quickSorted3(int arr[]) { int n = arr.length - 1; quickSorted3(arr, 0, n);
} private void quickSorted3(int[] arr, int L, int R) { if (L >= R)
return; int v = arr[L]; int lt = L;
int gt = R + 1;
int i = lt + 1; while (i < gt) { if (arr[i] < v) {
swap(arr, lt + 1, i);
i++;
lt++;
} else if (arr[i] > v) {
swap(arr, i, gt - 1);
gt--;
} else
i++;
}
swap(arr, lt, L); quickSorted3(arr, L, lt - 1);
quickSorted3(arr, gt, R);
}
六、堆排序
/**
* 堆排序
*/
public void heapSorted(int arr[]) { int n = arr.length; int pos = (n - 1) / 2;
for (int i = pos; i >= 0; i--) {
shiftDown(arr, i, n);
} for (int i = n - 1; i > 0; i--) { swap(arr, 0, i);
shiftDown(arr, 0, i);
} } private void shiftDown(int arr[], int pos, int n) { while (pos * 2 + 1 < n) { int k = (pos * 2) + 1;
if (k + 1 < n && arr[k + 1] > arr[k])
k = k + 1;
if (arr[pos] < arr[k]) {
swap(arr, k, pos);
pos = k;
} else
break;
}
}
七、希尔排序
/**
* 希尔排序
*/
public void shellSortd(int arr[]) { int n = arr.length; int i, j, h;
int tmp; for (h = n / 2; h > 0; h = h / 2) {
for (i = h; i < n; i++) {
tmp = arr[i];
for (j = i - h; j >= 0; j = j - h) {
if (tmp < arr[j])
arr[j + h] = arr[j];
else
break;
}
arr[j + h] = tmp; }
}
}
java 实现七大基本排序算法的更多相关文章
- Java实现经典七大经典排序算法
利用Java语言实现七大经典排序算法:冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序. 分类 类别 算法 插入排序类 插入排序.希尔排序 选择排序类 选择排序.堆排序 交换排序类 ...
- Java 的八种排序算法
Java 的八种排序算法 这个世界,需要遗忘的太多. 背景:工作三年,算法一问三不知. 一.八种排序算法 直接插入排序.希尔排序.简单选择排序.堆排序.冒泡排序.快速排序.归并排序和基数排序. 二.算 ...
- java SE 常用的排序算法
java程序员会用到的经典排序算法实现 常用的排序算法(以下代码包含的)有以下五类: A.插入排序(直接插入排序.希尔排序) B.交换排序(冒泡排序.快速排序) C.选择排序(直接选择排序.堆排序) ...
- 数据结构(三) 用java实现七种排序算法。
很多时候,听别人在讨论快速排序,选择排序,冒泡排序等,都觉得很牛逼,心想,卧槽,排序也分那么多种,就觉得别人很牛逼呀,其实不然,当我们自己去了解学习后发现,并没有想象中那么难,今天就一起总结一下各种排 ...
- Java实现八种排序算法(代码详细解释)
经过一个多星期的学习.收集.整理,又对数据结构的八大排序算法进行了一个回顾,在测试过程中也遇到了很多问题,解决了很多问题.代码全都是经过小弟运行的,如果有问题,希望能给小弟提出来,共同进步. 参考:数 ...
- (2)Java数据结构--二叉树 -和排序算法实现
=== 注释:此人博客对很多个数据结构类都有讲解-并加以实例 Java API —— ArrayList类 & Vector类 & LinkList类Java API —— BigDe ...
- [转载]图解程序员必须掌握的Java常用8大排序算法
这篇文章主要介绍了Java如何实现八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 .快速排序.归并排序.堆排序和LST基数排序,分享给大家一起学习. 分类1)插入排序(直接插入排序.希尔排 ...
- [java初探06]__排序算法的简单认识
今天,准备填完昨天没填的坑,将排序算法方面的知识系统的学习一下,但是在简单的了解了一下后,有些不知如何组织学习了,因为排序算法的种类,实在是太多了,各有优略,各有适用的场景.有些不知所措,从何开始. ...
- Java实现各种内部排序算法
数据结构中常见的内部排序算法: 插入排序:直接插入排序.折半插入排序.希尔排序 交换排序:冒泡排序.快速排序 选择排序:简单选择排序.堆排序 归并排序.基数排序.计数排序 直接插入排序: 思想:每次将 ...
随机推荐
- jqzoom插件图片放大功能的一些BUG
建议使用cloud-zoom插件,jqzoom插件就不要使用了 点击查看——图片放大镜——jQuery插件Cloud Zoom 刚开始使用的是jqzoom插件,但问题太多了,就不说插入到页面中使用了, ...
- 根据车辆品牌获取品牌所属公司,车标logo,创建年份等基本信息
接口:http://api.besttool.cn/?c=Car&a=brand 请求方式:post 参数: appid 请联系博主QQ987332767获取,注明车标接口,测试appid: ...
- 41-邮差送信(dfs)
邮差送信 (15分)C时间限制:1 毫秒 | C内存限制:3000 Kb题目内容: 有一个邮递员要在n个城市之间来回送信.但有的城市之间有大路相连而有的没有路.现在要由一个城市到另一个城市送信,中途 ...
- php识别二维码
php-zbarcode 是 PHP 读取条形码的扩展模块,目前仅支持 php5.x
- 使用JFinal框架连接数据库,实现注册、登录功能
使用JFinal框架连接数据库,实现注册.登录功能 1.在Eclipse中新建Dynamic Web project项目 2.导入jfinal-2.2-bin-with-src.jar.c3p0-0. ...
- UVa 12093 Protecting Zonk (树形DP)
题意:给定一个有n个节点的无根树,有两种装置A和B,每种都有无限多个.在某个节点X使用A装置需要C1的花费,并且此时与节点X相连的边都被覆盖.在某个节点X使用B装置需要C2的花费,并且此时与节点X相连 ...
- meterpreter命令
meterpreter详解与渗透实战 基本命令: background quit shell irb client.sys.config.sysinfo() 调用windows API:client. ...
- [翻译]Writing Component Editors 编写组件的编辑器
Writing Component Editors 编写组件的编辑器 All common control editors (opened from a control's context me ...
- Android-广播总结
1.发送广播: 其实发送广播属于隐式意图 1.1.系统发出的广播(有序广播/无序广播) 1.2自己发出的广播(有序广播/无序广播) 2.订阅广播: 2.1.AndroidManifest.xml形式订 ...
- IPA文件的自动化生成和无线分发
1. IPA的无线分发 iOS应用开发测试过程中,通过无线网络进行IPA包的分发将是非常便捷的,于是也就有了类似testflightapp之类的平台.对于这一功能,我们也可以自己实现,只需要一个简单的 ...