Java中的排序算法(1) 

package com.softeem.jbs.lesson4;

import java.util.Random;

/**
* 排序测试类
*
* 排序算法的分类如下:
* 1.插入排序(直接插入排序、折半插入排序、希尔排序);
* 2.交换排序(冒泡泡排序、快速排序);
* 3.选择排序(直接选择排序、堆排序);
* 4.归并排序;
* 5.基数排序。
*
* 关于排序方法的选择:
* (1)若n较小(如n≤50),可采用直接插入或直接选择排序。
*  当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插人,应选直接选择排序为宜。
* (2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜;
* (3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。
*
*/
public class SortTest { /**
* 初始化测试数组的方法
* @return 一个初始化好的数组
*/
public int[] createArray() {
Random random = new Random();
int[] array = new int[10];
for (int i = 0; i < 10; i++) {
array[i] = random.nextInt(100) - random.nextInt(100);//生成两个随机数相减,保证生成的数中有负数
}
System.out.println("==========原始序列==========");
printArray(array);
return array;
} /**
* 打印数组中的元素到控制台
* @param source
*/
public void printArray(int[] data) {
for (int i : data) {
System.out.print(i + " ");
}
System.out.println();
} /**
* 交换数组中指定的两元素的位置
* @param data
* @param x
* @param y
*/
private void swap(int[] data, int x, int y) {
int temp = data[x];
data[x] = data[y];
data[y] = temp;
} /**
* 冒泡排序----交换排序的一种
* 方法:相邻两元素进行比较,如有需要则进行交换,每完成一次循环就将最大元素排在最后(如从小到大排序),下一次循环是将其他的数进行类似操作。
* 性能:比较次数O(n^2),n^2/2;交换次数O(n^2),n^2/4
*
* @param data 要排序的数组
* @param sortType 排序类型
* @return
*/
public void bubbleSort(int[] data, String sortType) {
if (sortType.equals("asc")) { //正排序,从小排到大
//比较的轮数
for (int i = 1; i < data.length; i++) {
//将相邻两个数进行比较,较大的数往后冒泡
for (int j = 0; j < data.length - i; j++) {
if (data[j] > data[j + 1]) {
//交换相邻两个数
swap(data, j, j + 1);
}
}
}
} else if (sortType.equals("desc")) { //倒排序,从大排到小
//比较的轮数
for (int i = 1; i < data.length; i++) {
//将相邻两个数进行比较,较大的数往后冒泡
for (int j = 0; j < data.length - i; j++) {
if (data[j] < data[j + 1]) {
//交换相邻两个数
swap(data, j, j + 1);
}
}
}
} else {
System.out.println("您输入的排序类型错误!");
}
printArray(data);//输出冒泡排序后的数组值
} /**
* 直接选择排序法----选择排序的一种
* 方法:每一趟从待排序的数据元素中选出最小(或最大)的一个元素, 顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
* 性能:比较次数O(n^2),n^2/2
* 交换次数O(n),n
* 交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CUP时间多,所以选择排序比冒泡排序快。
* 但是N比较大时,比较所需的CPU时间占主要地位,所以这时的性能和冒泡排序差不太多,但毫无疑问肯定要快些。
*
* @param data 要排序的数组
* @param sortType 排序类型
* @return
*/
public void selectSort(int[] data, String sortType) { if (sortType.equals("asc")) { //正排序,从小排到大
int index;
for (int i = 1; i < data.length; i++) {
index = 0;
for (int j = 1; j <= data.length - i; j++) {
if (data[j] > data[index]) {
index = j; }
}
//交换在位置data.length-i和index(最大值)两个数
swap(data, data.length - i, index);
}
} else if (sortType.equals("desc")) { //倒排序,从大排到小
int index;
for (int i = 1; i < data.length; i++) {
index = 0;
for (int j = 1; j <= data.length - i; j++) {
if (data[j] < data[index]) {
index = j; }
}
//交换在位置data.length-i和index(最大值)两个数
swap(data, data.length - i, index);
}
} else {
System.out.println("您输入的排序类型错误!");
}
printArray(data);//输出直接选择排序后的数组值
} /**
* 插入排序
* 方法:将一个记录插入到已排好序的有序表(有可能是空表)中,从而得到一个新的记录数增1的有序表。
* 性能:比较次数O(n^2),n^2/4
* 复制次数O(n),n^2/4
* 比较次数是前两者的一般,而复制所需的CPU时间较交换少,所以性能上比冒泡排序提高一倍多,而比选择排序也要快。
*
* @param data 要排序的数组
* @param sortType 排序类型
*/
public void insertSort(int[] data, String sortType) {
if (sortType.equals("asc")) { //正排序,从小排到大
//比较的轮数
for (int i = 1; i < data.length; i++) {
//保证前i+1个数排好序
for (int j = 0; j < i; j++) {
if (data[j] > data[i]) {
//交换在位置j和i两个数
swap(data, i, j);
}
}
}
} else if (sortType.equals("desc")) { //倒排序,从大排到小
//比较的轮数
for (int i = 1; i < data.length; i++) {
//保证前i+1个数排好序
for (int j = 0; j < i; j++) {
if (data[j] < data[i]) {
//交换在位置j和i两个数
swap(data, i, j);
}
}
}
} else {
System.out.println("您输入的排序类型错误!");
}
printArray(data);//输出插入排序后的数组值
} /**
* 反转数组的方法
* @param data 源数组
*/
public void reverse(int[] data) { int length = data.length;
int temp = 0;//临时变量 for (int i = 0; i < length / 2; i++) {
temp = data[i];
data[i] = data[length - 1 - i];
data[length - 1 - i] = temp;
}
printArray(data);//输出到转后数组的值
}

原文地址:http://user.qzone.qq.com/372806800/blog/1336198302

package com.softeem.jbs.lesson4;

import java.util.Random;

/**

* 排序测试类

*

* 排序算法的分类如下:

* 1.插入排序(直接插入排序、折半插入排序、希尔排序);

* 2.交换排序(冒泡泡排序、快速排序);

* 3.选择排序(直接选择排序、堆排序);

* 4.归并排序;

* 5.基数排序。

*

* 关于排序方法的选择:

* (1)若n较小(如n≤50),可采用直接插入或直接选择排序。

*  当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插人,应选直接选择排序为宜。

* (2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜;

* (3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。

*

*/

public class SortTest {

/**

* 初始化测试数组的方法

@return 一个初始化好的数组

*/

public int[] createArray() {

Random random = new Random();

int[] array = new int[10];

for (int i = 0; i < 10; i++) {

array[i] = random.nextInt(100) - random.nextInt(100);//生成两个随机数相减,保证生成的数中有负数

}

System.out.println("==========原始序列==========");

printArray(array);

return array;

}

/**

* 打印数组中的元素到控制台

@param source

*/

public void printArray(int[] data) {

for (int i : data) {

System.out.print(i + " ");

}

System.out.println();

}

/**

* 交换数组中指定的两元素的位置

@param data

@param x

@param y

*/

private void swap(int[] data, int x, int y) {

int temp = data[x];

data[x] = data[y];

data[y] = temp;

}

/**

* 冒泡排序----交换排序的一种

* 方法:相邻两元素进行比较,如有需要则进行交换,每完成一次循环就将最大元素排在最后(如从小到大排序),下一次循环是将其他的数进行类似操作。

* 性能:比较次数O(n^2),n^2/2;交换次数O(n^2),n^2/4

*

@param data 要排序的数组

@param sortType 排序类型

@return

*/

public void bubbleSort(int[] data, String sortType) {

if (sortType.equals("asc")) { //正排序,从小排到大

//比较的轮数

for (int i = 1; i < data.length; i++) {

//将相邻两个数进行比较,较大的数往后冒泡

for (int j = 0; j < data.length - i; j++) {

if (data[j] > data[j + 1]) {

//交换相邻两个数

swap(data, j, j + 1);

}

}

}

else if (sortType.equals("desc")) { //倒排序,从大排到小

//比较的轮数

for (int i = 1; i < data.length; i++) {

//将相邻两个数进行比较,较大的数往后冒泡

for (int j = 0; j < data.length - i; j++) {

if (data[j] < data[j + 1]) {

//交换相邻两个数

swap(data, j, j + 1);

}

}

}

else {

System.out.println("您输入的排序类型错误!");

}

printArray(data);//输出冒泡排序后的数组值

}

/**

* 直接选择排序法----选择排序的一种

* 方法:每一趟从待排序的数据元素中选出最小(或最大)的一个元素, 顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

* 性能:比较次数O(n^2),n^2/2

*       交换次数O(n),n

*       交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CUP时间多,所以选择排序比冒泡排序快。

*       但是N比较大时,比较所需的CPU时间占主要地位,所以这时的性能和冒泡排序差不太多,但毫无疑问肯定要快些。

*

@param data 要排序的数组

@param sortType 排序类型

@return

*/

public void selectSort(int[] data, String sortType) {

if (sortType.equals("asc")) { //正排序,从小排到大

int index;

for (int i = 1; i < data.length; i++) {

index = 0;

for (int j = 1; j <= data.length - i; j++) {

if (data[j] > data[index]) {

index = j;

}

}

//交换在位置data.length-i和index(最大值)两个数

swap(data, data.length - i, index);

}

else if (sortType.equals("desc")) { //倒排序,从大排到小

int index;

for (int i = 1; i < data.length; i++) {

index = 0;

for (int j = 1; j <= data.length - i; j++) {

if (data[j] < data[index]) {

index = j;

}

}

//交换在位置data.length-i和index(最大值)两个数

swap(data, data.length - i, index);

}

else {

System.out.println("您输入的排序类型错误!");

}

printArray(data);//输出直接选择排序后的数组值

}

/**

* 插入排序

* 方法:将一个记录插入到已排好序的有序表(有可能是空表)中,从而得到一个新的记录数增1的有序表。

* 性能:比较次数O(n^2),n^2/4

*       复制次数O(n),n^2/4

*       比较次数是前两者的一般,而复制所需的CPU时间较交换少,所以性能上比冒泡排序提高一倍多,而比选择排序也要快。

*

@param data 要排序的数组

@param sortType 排序类型

*/

public void insertSort(int[] data, String sortType) {

if (sortType.equals("asc")) { //正排序,从小排到大

//比较的轮数

for (int i = 1; i < data.length; i++) {

//保证前i+1个数排好序

for (int j = 0; j < i; j++) {

if (data[j] > data[i]) {

//交换在位置j和i两个数

swap(data, i, j);

}

}

}

else if (sortType.equals("desc")) { //倒排序,从大排到小

//比较的轮数

for (int i = 1; i < data.length; i++) {

//保证前i+1个数排好序

for (int j = 0; j < i; j++) {

if (data[j] < data[i]) {

//交换在位置j和i两个数

swap(data, i, j);

}

}

}

else {

System.out.println("您输入的排序类型错误!");

}

printArray(data);//输出插入排序后的数组值

}

/**

* 反转数组的方法

@param data 源数组

*/

public void reverse(int[] data) {

int length = data.length;

int temp = 0;//临时变量

for (int i = 0; i < length / 2; i++) {

temp = data[i];

data[i] = data[length - 1 - i];

data[length - 1 - i] = temp;

}

printArray(data);//输出到转后数组的值

}

Java排序算法(1)的更多相关文章

  1. 常用Java排序算法

    常用Java排序算法 冒泡排序 .选择排序.快速排序 package com.javaee.corejava; public class DataSort { public DataSort() { ...

  2. Java排序算法之直接选择排序

    Java排序算法之直接选择排序 基本过程:假设一序列为R[0]~R[n-1],第一次用R[0]和R[1]~R[n-1]相比较,若小于R[0],则交换至R[0]位置上.第二次从R[1]~R[n-1]中选 ...

  3. java排序算法(一):概述

    java排序算法(一)概述 排序是程序开发中一种非常常见的操作,对一组任意的数据元素(活记录)经过排序操作后,就可以把它们变成一组按关键字排序的一组有序序列 对一个排序的算法来说,一般从下面三个方面来 ...

  4. java排序算法(十):桶式排序

    java排序算法(十):桶式排序 桶式排序不再是一种基于比较的排序方法,它是一种比较巧妙的排序方式,但这种排序方式需要待排序的序列满足以下两个特征: 待排序列所有的值处于一个可枚举的范围之类: 待排序 ...

  5. java排序算法(九):归并排序

    java排序算法(九):归并排序

  6. java排序算法(八):希尔排序(shell排序)

    java排序算法(八):希尔排序(shell排序) 希尔排序(缩小增量法)属于插入类排序,由shell提出,希尔排序对直接插入排序进行了简单的改进,它通过加大插入排序中元素之间的间隔,并在这些有间隔的 ...

  7. java排序算法(七):折半插入排序

    java排序算法(七):折半插入排序 折半插入排序法又称为二分插入排序法,是直接插入排序法的改良版本,也需要执行i-1趟插入.不同之处在于第i趟插入.先找出第i+1个元素应该插入的位置.假设前i个数据 ...

  8. java排序算法(六):直接插入排序

    java排序算法(六):直接插入排序 直接插入排序的基本操作就是将待的数据元素按其关键字的大小插入到前面的有序序列中 直接插入排序时间效率并不高,如果在最坏的情况下,所有元素的比较次数的总和为(0+1 ...

  9. java排序算法(五):快速排序

    java排序算法(五):快速排序 快速排序是一个速度非常快的交换排序算法,它的基本思路很简单,从待排的数据序列中任取一个数据(如第一个数据)作为分界值,所有比它小的元素放到左边.所有比它大的元素放到右 ...

  10. java排序算法(四):冒泡排序

    java排序算法(四):冒泡排序 冒泡排序是计算机的一种排序方法,它的时间复杂度是o(n^2),虽然不及堆排序.快速排序o(nlogn,底数为2).但是有两个优点 1.编程复杂度很低.很容易写出代码 ...

随机推荐

  1. 移动端公共css样式

    @media screen and ( min-width: 319px){html{ font-size: 100px;}}@media screen and ( min-width: 359px) ...

  2. ubuntu14.04安装Docker

    Ubuntu在14.02开始就已经集成了Docker,要安装很简单:   1 2 3 4 sudo apt-get update sudo apt-get install docker.io sudo ...

  3. 微信支付开发(3) JS API支付

    由于微信支付接口更新,本文档已过期,请查看新版微信支付教程.地址 http://www.cnblogs.com/txw1958/category/624506.html 本文介绍如何使用JS API支 ...

  4. Android HttpClient基本使用方法

    GET 方式 //先将参数放入List,再对参数进行URL编码 List<BasicNameValuePair> params = new LinkedList<BasicNameV ...

  5. RFS_oracle的操作

    1. cx_Oracle Python 连接Oracle 数据库,需要使用cx_Oracle 包. 该包的下载地址:http://cx-Oracle.sourceforge.net/ 下载的时候,注意 ...

  6. Windows 8上使用SQL 2012 Configuration Manager

    现在使用Windows 8 + Sql Server 2012,而今天想用SQL 2012 Configuraton Manager, 设置别名来访问不同的开发数据库.但发现没能找到SQL 2012 ...

  7. button点击传多个参数

    // --------------------button点击传多个参数------------------------ UIButton *btn = [UIButton buttonWithTyp ...

  8. Android Push Notification实现信息推送使用

    本贴在http://www.cnblogs.com/hanyonglu/archive/2012/03/16/2399655.html下略为改动. Apndroid Push Notification ...

  9. 【转】Tomcat总体结构(Tomcat源代码阅读系列之二)

    本文是Tomcat源代码阅读系列的第二篇文章,我们在本系列的第一篇文章:在IntelliJ IDEA 和 Eclipse运行tomcat 7源代码一文中介绍了如何在intelliJ IDEA 和 Ec ...

  10. [原创]java WEB学习笔记71:Struts2 学习之路-- struts2常见的内建验证程序及注意点,短路验证,非字段验证,错误消息的重用

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...