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实现各种内部排序算法
数据结构中常见的内部排序算法: 插入排序:直接插入排序.折半插入排序.希尔排序 交换排序:冒泡排序.快速排序 选择排序:简单选择排序.堆排序 归并排序.基数排序.计数排序 直接插入排序: 思想:每次将 ...
随机推荐
- 今天无意中发现的WWW.threadPriority
WWW.threadPriority Description Priority of AssetBundle decompression thread. You can control dec ...
- [SoapUI]获取Project,Test Suite,Test Case各个级别参数的值
String testResultPath = testRunner.testCase.testSuite.project.getPropertyValue( "testResultPath ...
- 微交互:App成功的秘诀
以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 最好的产品拥有两个很棒的特点:功能和细节.产品的功能可成功吸引到人们的注意力,而产品的细节则可留住你 ...
- ubuntu系统下安装pyspider:解决pyspider启动时不启动phantomjs问题
问题描述: 在建立第一个虚拟环境时,运行pyspider正常.建立第二个虚拟环境时,运行pyspider再现下面错误.应该是phantomjs没有启动成功. 错误代码:(phantomjs:21507 ...
- 20155209 2016-2017-2 《Java程序设计》第七周学习总结
20155209 2016-2017-2 <Java程序设计>第七周学习总结 教材学习内容总结 认识时间与日期 时间的度量 GMT(Greenwich Mean Time) 时间:现在不是 ...
- scalr调用openstack接口
- scala高阶函数类型推断什么时候失效?
class TypeInfer(self: Int, other: Int) { def test(num: Int, word: String, fun1: (Int, Int) => Int ...
- csdn的博客上传word图片
目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...
- 两个openssh间免密码登录
以下针对的是openssh,而不是ssh,也不是ssh2.配置分两部分:一是对登录机的配置,二是对被登录机的配置,其中登录机为客户端,被登录机为服务端,也就是解决客户端到服务端的无密码登录问题.下述涉 ...
- SpringMVC源码解析- HandlerAdapter初始化
HandlerAdapter初始化时,主要是进行注解解析器初始化注册;返回值处理类初始化;全局注解@ControllerAdvice内容读取并缓存. 目录: 注解解析器初始化注册:@ModelAttr ...