package edu.cn.ysw;

//八种排序算法的实现与效率分析
/*
* 内排序的种类:
* 1.插入排序:直接插入排序、希尔排序。
* 2.选择排序:简单选择排序、堆排序。
3.交换排序:冒泡排序、快速排序。
4.归并排序
5.基数排序
*/
public class SortedMethods { /**
* @author ysw
* @param args
* @throws Exception
* @since 6/15/2017
*/
// 直接插入排序:1.有哨兵;2.无哨兵
// 无哨兵
public void insertSortWithoutPre(int arr[]) {
if (arr == null || arr.length == 0) {
return;
}
// 外层循环定义排序次数
for (int i = 1; i < arr.length; i++) {
// 不满足条件则忽略此次判断,相当于continue;
if (arr[i] < arr[i - 1]) {
int tempValue = arr[i];
int j;
for (j = i - 1; j >= 0 && tempValue < arr[j]; j--) {
arr[j + 1] = arr[j];
}
arr[j + 1] = tempValue;
}
}
} // 有哨兵的直接插入排序
public void insertSortWithPre(int arr[]) {
for (int i = 2; i < arr.length; i++) {
/*
* 哨兵的作用: 1:保存等待插入的数字; 2:防止数组越界的情况;
*/
if (arr[i] < arr[i - 1]) {
arr[0] = arr[i];
int j;
for (j = i - 1; arr[0] < arr[j]; j--) {
arr[j + 1] = arr[j];
}
arr[j + 1] = arr[0];
}
}
} // 希尔排序
public void shellSort(int arr[]) {
if (arr == null || arr.length == 0) {
return;
}
// 增量序列
int incrementValue = arr.length / 2;
while (incrementValue >= 1) {
for (int i = 0; i < arr.length; i++) {
for (int j = i + incrementValue; j < arr.length; j += incrementValue) {
int temp = arr[j];
int k;
for (k = j - incrementValue; k >= 0 && arr[k] > temp; k = k
- incrementValue) {
arr[k + incrementValue] = arr[k];
}
arr[k + incrementValue] = temp;
}
}
// 改变递增序列的值
incrementValue /= 2;
}
} /*
* 选择排序: 1.简单选择排序 2.堆排序
*/ // 简单选择排序
public void selectSort(int arr[]) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
swap(arr, i, j);
}
}
}
} // 堆排序:实践中多用于调度算法,比如线程优先级调度
// 时间驱动:取最小值或者等待时间最长 // 冒泡排序
public void bubbleSort(int arr[]) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr, j, j + 1);
}
}
}
} // 快速排序:挖坑填数+分治 // 快速排序返回基准值最终位置的函数partition:回调整后基准数的位置
public int partition(int arr[], int l, int r) {
// 假设第一个基准值为arr[0];
int left = l;
int right = r;
int key = arr[left];
while (left < right) {
while (left < right && arr[right] >= key) {
right--;
}
if (left < right) {
arr[left] = arr[right];
left++;
}
while (left < right && arr[left] <= key) {
left++;
}
if (left < right) {
arr[right] = arr[left];
right--;
}
}
arr[left] = key; return left;
} // 快速排序
public void quickSort(int arr[], int l, int r) {
if (l < r) {
int index = partition(arr, l, r);
quickSort(arr, l, index - 1);
quickSort(arr, index + 1, r);
}
} // 归并排序 public void mergeSort(int arr[]) {
sort(arr, 0, arr.length - 1);
} public void sort(int[] arr, int left, int right) {
if (left >= right) {
return;
}
int center = (left + right) / 2;
sort(arr, left, center);
sort(arr, center + 1, right);
merge(arr, left, center, right);
} public void merge(int[] arr, int left, int center, int right) {
// 定义一个辅助数组来存放归并的两个子数组
int tempArray[] = new int[arr.length];
// 左面子数组的第一个元素
int leftFirst = left;
// 右面子数组的第一个元素
int rightFirst = center + 1;
// 指向辅助数组的第一个元素
int tempPointer = left;
while (leftFirst <= center && rightFirst <= right) {
if (arr[leftFirst] <= arr[rightFirst]) {
tempArray[tempPointer++] = arr[leftFirst++];
} else {
tempArray[tempPointer++] = arr[rightFirst++]; }
} // 将第一个数组中剩下的元素添加到辅助数组中
while (leftFirst <= center) {
tempArray[tempPointer++] = arr[leftFirst++];
}
// 将第二个数组中剩下的元素添加到辅助数组中
while (rightFirst <= right) {
tempArray[tempPointer++] = arr[rightFirst++];
}
} // 打印数组的函数
public void printArr(int arr[]) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
if (i != arr.length - 1) {
System.out.print(",");
}
}
System.out.println();
} // 交换数组的元素
public void swap(int arr[], int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
} public static void main(String[] args) {
SortedMethods sMethods = new SortedMethods();
// 测试需要的数组
int array1[] = { 1, 2, 3, 4, 5 };
int array2[] = { 5, 4, 3, 2, 1 };
int array3[] = { 4, 5, 2, 1, 7 };
int array4[] = null;
int array5[] = new int[0];
// 测试无哨兵的插入排序 System.out.println("--------有哨兵插入排序--------------"); sMethods.insertSortWithoutPre(array1);
sMethods.printArr(array1);
sMethods.insertSortWithoutPre(array2);
sMethods.printArr(array2);
sMethods.insertSortWithoutPre(array3);
sMethods.printArr(array3);
/*
* sMethods.insertSortWithoutPre(array4); sMethods.printArr(array4);
* sMethods.insertSortWithoutPre(array5); sMethods.printArr(array5);
*/
System.out.println("--------无哨兵插入排序------------");
// 测试有哨兵的插入排序
sMethods.insertSortWithoutPre(array1);
sMethods.printArr(array1);
sMethods.insertSortWithoutPre(array2);
sMethods.printArr(array2);
sMethods.insertSortWithoutPre(array3);
sMethods.printArr(array3);
System.out.println("----------希尔排序------------");
// 测试希尔排序
sMethods.shellSort(array1);
sMethods.printArr(array1);
sMethods.shellSort(array2);
sMethods.printArr(array2);
sMethods.shellSort(array3);
sMethods.printArr(array3);
System.out.println("---------简单选择排序------------");
sMethods.selectSort(array1);
sMethods.printArr(array1);
sMethods.selectSort(array2);
sMethods.printArr(array2);
sMethods.selectSort(array3);
sMethods.printArr(array3);
System.out.println("---------冒泡排序------------");
sMethods.bubbleSort(array1);
sMethods.printArr(array1);
sMethods.bubbleSort(array2);
sMethods.printArr(array2);
sMethods.bubbleSort(array3);
sMethods.printArr(array3);
System.out.println("---------快速排序------------");
sMethods.quickSort(array3, 0, array3.length - 1);
sMethods.printArr(array3);
System.out.println("---------归并排序排序------------");
sMethods.mergeSort(array3);
sMethods.printArr(array3); } }

  

六种常见排序算法的java实现的更多相关文章

  1. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

  2. 常见排序算法总结 -- java实现

    常见排序算法总结 -- java实现 排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间 ...

  3. 常见排序算法(java实现)

    常见排序算法介绍 冒泡排序 代码: public class BubbleSort { public static void sort(int[] array) { int tValue; for ( ...

  4. 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)

    排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列. 稳定度(稳定性)一个排序算法是稳定的,就是当有两个相等记录的关 ...

  5. 几种常见排序算法的java实现

    一.几种常见的排序算法性能比較 排序算法 最好时间 平均时间 最坏时间 辅助内存 稳定性 备注 简单选择排序 O(n^2) O(n^2) O(n^2) O(1) 不稳定 n小时较好 直接插入排序 O( ...

  6. 常见排序算法及Java实现

    先上个总图↓: ①.直接插入排序 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并 ...

  7. 常见排序算法及其java实现

    最近学习了下java,感觉java在基本语法上与C++非常相似.作为练习,我用java实现了冒泡排序.选择排序.插入排序.基尔排序.快速排序.堆排序.计数排序.合并排序. 以下为实现代码: publi ...

  8. 常见排序算法题(java版)

    常见排序算法题(java版) //插入排序:   package org.rut.util.algorithm.support;   import org.rut.util.algorithm.Sor ...

  9. Java基础语法(8)-数组中的常见排序算法

    title: Java基础语法(8)-数组中的常见排序算法 blog: CSDN data: Java学习路线及视频 1.基本概念 排序: 是计算机程序设计中的一项重要操作,其功能是指一个数据元素集合 ...

随机推荐

  1. 【经典】5种IO模型 | IO多路复用

    上篇回顾:静态服务器+压测 3.2.概念篇 1.同步与异步 同步是指一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成. 异步是指不需要等待被依赖的任务完成,只是通 ...

  2. JSOUP 乱码处理

    JSOUP  支持在请求的时候,传入URL 对象,然后设置编码.如下方式才是正解,设置编码为GBK . doc = Jsoup.parse(new URL(url).openStream(), &qu ...

  3. wriesharek同时监听多个端口

    之前的文章<wireshark解析自定义的protobuf协议> ,当时只监听了一个端口,而如果游戏同时有二个 socket 连接,比如一个是网关另外一个是其它的,怎么办呢? for i, ...

  4. [C#] .NET Core项目修改project.json来引用其他目录下的源码等文件的办法 & 解决多框架时 project.json 与 app.config冲突的问题

    作者: zyl910 一.缘由 项目规模大了后,经常会出现源码文件分布在不同目录的情况,但.NET Core项目默认只有项目目录下的源码文件,且不支持"Add As Link"方式 ...

  5. SQL Server 性能优化实战系列(二)

    SQL Server datetime数据类型设计.优化误区 一.场景 在SQL Server 2005中,有一个表TestDatetime,其中Dates这个字段的数据类型是datetime,如果你 ...

  6. Python源码中的PyCodeObject

    1.Python程序的执行过程 Python解释器(interpreter)在执行任何一个Python程序文件时,首先进行的动作都是先对文件中的Python源代码进行编译,编译的主要结果是产生的一组P ...

  7. zabbix之微信告警(python版):微信个人报警,微信企业号告警脚本

    微信个人告警脚本 微信个人告警:使用个人微信,发送到微信群组,微信好友 两个脚本执行: 1)能连接网络2)先执行server.py,扫描登录微信,登录之后没有报错,打开新终端查看端口是否起来了3)在z ...

  8. Windows上使用Vagrant打造Laravel Homestead可协同跨平台开发环境

    1.简介 Laravel 致力于让整个 PHP 开发过程变得让人愉悦,包括本地开发环境,为此官方为我们提供了一整套本地开发环境 —— Laravel Homestead. Laravel Homest ...

  9. matplotlib绘图不显示问题解决plt.show()

    最近在看<Python数据分析>这本书,而自己写代码一直用的是Pycharm,在练习的时候就碰到了plot()绘图不能显示出来的问题.网上翻了一下找到知乎上一篇回答,试了一下好像不行,而且 ...

  10. 你可能不知道的IDEA高级调试技巧

    一.条件断点 循环中经常用到这个技巧,比如:遍历1个大List的过程中,想让断点停在某个特定值. 参考上图,在断点的位置,右击断点旁边的小红点,会出来一个界面,在Condition这里填入断点条件即可 ...