在Java中,实现数组的排序算法有很多,如冒泡排序法、选择排序法、直接插入法和快速排序法、归并排序等。下面介绍几种排序算法的具体 实现。

  本文引用文献:Java必须知道的300个问题。

1.冒泡排序法

  1.1 基本思想:

    比较待排序的数据元素中的相邻元素:如果前面的元素大于后面的元素,那么将两个元素交换位置;否则不变。即:永远保持大的元素值在待排序元素中的最后面位置。这样,数组元素就像气泡一样从底部上升到顶部。

  1.2 过程实例:

    每一轮,排序数组的长度减1次(每一轮结束后,最大元素都是最后一个元素。因此下轮比较过程中最后一次比较不用进行。)

  1.3 代码实现

public static void main(String[] args) {
//初始化数组
int[] array = {63,4,24,1,3,13};
//排序
for (int i = 1; i < array.length; i++) {
for (int j = 0; j < array.length - i; j++) {
if(array[j] > array[j+1]){
int temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
//输出结果
System.out.println(Arrays.toString(array));
}

2. 选择排序法

  2.1 基本思想

    每一轮从待排序的数据元素中选出最小(最大)的一个元素,将该元素(通过与相邻元素交换的方式)移到待排序的数据元素的最前面(最后面),直到全部待排序的数据元素排完。  

  2.2 过程实例  

 2.3 代码实现

//初始化数组
int[] array = {,,,,,}; //排序
int len = array.length;
//控制轮数
for (int i = 1; i < len; i++) {
int max = array[];
int index = ;
//查找最大值
for (int j = ; j < len - (i - 1); j++) {
if(max < array[j]){
max = array[j];
index = j;
}
}
//互换位置
int temp = array[index];
array[index] = array[len - i];
array[len - i] = temp;
} //输出
System.out.println(Arrays.toString(array));

3. 直接插入排序法

  3.1 基本思想

    1. 将n个有序元素放在数组中 --> 2.确认要插入元素的位置 --> 3.将数组中的要插入元素的位置后面的元素向后移一个位置  --> 4.将要出如的元素插到合适的位置上 --> 5.重复2. 3. 4.直到所有元素均插入到数组中。

  3.2 过程实例

    

  3.3 代码实现

    

//初始化数组
int[] array = {20,40,90,30,80,70,50}; //排序
int j;
for (int i = 1; i < array.length; i++) {
int temp = array[i];
for (j = i - 1; j > 0 && array[j] > temp; j--) {
array[j+1] = array[j];
}
array[j+1] = temp;
} //输出
System.out.println(Arrays.toString(array));

4. 快速排序法

  4.1 基本思想

    通过一趟排序将要排序的数据分割成独立的两部分(通常选取中数作为分割线),其中一部分的所有数据都比另一部分的所有数据要小,然后再按此方法对这两部分数据进行快速排序,整个过程可以通过递归进行。

  4.2 过程实例

  4.3 代码实现

public static void main(String[] args) {
//初始化数组
int[] array = {49,38,65,97,76,13,27,49}; //排序
quickSort(array, 0, array.length - 1); //输出
System.out.println(Arrays.toString(array)); } private static void quickSort(int[] array, int lowIndex, int highIndex) {
int lo = lowIndex;
int hi = highIndex;
int mid;
if(highIndex > lowIndex){
mid = array[(lowIndex + highIndex) / 2];
while(lo <= hi){
while((lo < highIndex) && (array[lo] < mid)){
++lo;
}
while(hi > lowIndex && array[hi] >mid){
--hi;
}
if(lo <= hi){
swap(array,lo,hi);
++lo;
--hi;
}
}
if(lowIndex <hi){
quickSort(array, lowIndex, hi);
}
if(lo < highIndex){
quickSort(array, lo, highIndex);
}
}
} private static void swap(int[] array, int lo, int hi) {
int temp = array[lo];
array[lo] = array[hi];
array[hi] = temp;
}

  4.4 算法评价

    快速排序是通用排序算法的传统选择。

5. 归并排序

  5.1 基本思想

    将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。

  5.2 过程实例

    将序列拆分成子序列(每个子序列中有两个元素),将每个子序列进行排序(如:第一轮);然后将拆分后的子序列进行两两合并,如果有落单的子序列,合并入上一组(如:第二轮)。重复合并的逻辑,一直到最后只剩下一个数组(该数组以实现排序),结束。

   5.3 代码实现
package com.BlueStarWei.test;

public class Test2 {

  public static void main(String[] args) {
int[] a = new int[]{43, 35, 62, 13, 24, 57,88,91,4,6,34};
mergeSort(a, 0, 1);
for (int i = 0; i < a.length; ++i) {
System.out.print(a[i] + " ");
}
} /**
*  * <pre>
*  * 二路归并
*  * 原理:将两个有序表合并和一个有序表
*  * </pre>
*  *
*  * @param a
*  * @param low
*  * 第一个有序表的起始下标
*  * @param low2
*  * 第二个有序表的起始下标
*  * @param hight2
*  * 第二个有序表的结束小标
*  *
*/
private static void merge(int[] a, int low, int low2, int hight2) {
//1.分配空间存放比较后的元素
int[] tmp = new int[hight2 - low + 1];
int i = low, j = low2, k = 0;
//2.将较小的元素存入tmp
while (i < low2 && j <= hight2) {
if (a[i] <= a[j]) {
tmp[k] = a[i];
k++;
i++;
} else {
tmp[k] = a[j];
j++;
k++;
}
}
//3.将进行排序的元素中最大的元素存入tmp
while (i < low2) {
tmp[k] = a[i];
i++;
k++;
}
while (j <= hight2) {
tmp[k] = a[j];
j++;
k++;
}
//4.将排好顺序的元素存入a(替代原有元素)
System.arraycopy(tmp, 0, a, low, tmp.length); } /**
*  *
*  * @param a
*  * @param low
* 第一个有序表的起始下标
*  * @param mergeLen
*  *  每一次进行合并的数组长度
*/
public static void mergeSort(int[] a, int low, int mergeLen) {
int size = a.length;
int mid = size / (mergeLen << 1);
//判断进行分割后的数组数量是否是奇数个
int c = size & ((mergeLen << 1) - 1);
// -------归并到只剩一个有序集合的时候结束算法-------//
if (mid == 0)
return;
// ------进行一趟归并排序-------//
for (int i = 0; i < mid; ++i) {
low = i * 2 * mergeLen;
merge(a, low, low + mergeLen, (mergeLen << 1) + low - 1);
}
// -------将剩下的数和倒数一个有序集合归并-------//
if (c != 0)
merge(a, size - c - 2 * mergeLen, size - c, size - 1); for (int i = 0; i < a.length; ++i) {
System.out.print(a[i] + " ");
}
System.out.println();
// -------递归执行下一趟归并排序------//
mergeSort(a, 0, 2 * mergeLen);
} }

  5.4 算法评价

    归并排序的一个主要的优点是:稳定,即不需要交换相同的元素。

    因此多应用于以下场景:假设有一张按照姓名排序的员工列表。现在要按工资排序。使用归并排序可以在按照工资排序的时候保留按名字排列的顺序(即:排序的结果是,先按工资排序,工资相同的按照姓名排序。)

  更多内容,请访问:http://www.cnblogs.com/BlueStarWei/

Java数组的排序算法的更多相关文章

  1. Java中的排序算法(2)

    Java中的排序算法(2) * 快速排序 * 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists). * 步骤为: * 1. 从数 ...

  2. java实现各种排序算法

    java实现各种排序算法 import java.util.Arrays; public class SomeSort { public static void main(String[] args) ...

  3. Shell数组以及排序算法(冒泡、直接选择、反转)

    Shell数组以及排序算法(冒泡.直接选择.反转) 目录 Shell数组以及排序算法(冒泡.直接选择.反转) 一.数组概述 1. 数组的定义 2. 下标的定义 3. 数组的特点 4. 数组定义的方法 ...

  4. java基础---数组的排序算法(3)

    一.排序的基本概念 排序:将一个数据元素集合或序列重新排列成按一个数据元素某个数据项值有序的序列 稳定排序:排序前和排序后相同元素的位置关系与初始序列位置一致(针对重复元素来说,相对位置不变) 不稳定 ...

  5. java se系列(四) 函数、数组、排序算法、二分法、二维数组

    1 函数 1.1  数的概述 发现不断进行加法运算,为了提高代码的复用性,就把该功能独立封装成一段独立的小程序,当下次需要执行加法运算的时候,就可以直接调用这个段小程序即可,那么这种封装形形式的具体表 ...

  6. 02-Java 数组和排序算法

    一.Java 数组 1.数组定义:数组是有序数据的集合,数组中的每个元素具有相同的数组名和下标来做唯一标识. 2.数组的分类:一维.二维.三维. 3.数组声明及内存分配: 为数组分配内存空间:如果不分 ...

  7. Java实现常见排序算法

    常见的排序算法有冒泡排序.选择排序.插入排序.堆排序.归并排序.快速排序.希尔排序.基数排序.计数排序,下面通过Java实现这些排序 1.冒泡排序 package com.buaa; import j ...

  8. java实现八大排序算法

    Arrays.sort() 采用了2种排序算法 -- 基本类型数据使用快速排序法,对象数组使用归并排序. java的Collections.sort算法调用的是归并排序,它是稳定排序 方法一:直接插入 ...

  9. Java常用的排序算法三

    Merge Sort :归并排序:用递归的思想,分解成单个元素的排序,在归并 代码: import java.util.*; public class MergeSort { public stati ...

随机推荐

  1. 记一次搭建SS服务器,完整的过程。

    前言 这几天为了登录外网查询资料,谷歌经常抽风,国外的博客也打不开,都要整崩溃了.我以前(直到昨天以前)都是使用修改hosts来访问外网的,用的是 老D(https://laod.cn/hosts)  ...

  2. XJOI1424解压字符串

    解压字符串 给你一个字符串S,S是已经被加密过的字符串.现在要求你把字符串S还原.字符串S可能会出现这样的格式:k(q),它表示字符串q重复了k次,其中q是0个或多个字符,而k是一个数字,范围是0至9 ...

  3. JavaWeb之HTTP协议

    一.概念 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器. ...

  4. JavaWeb之session

    Session是服务器端技术 利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自 ...

  5. VB中的GDI编程-1 设备环境DC

    p{ font-size: 15px; } .alexrootdiv>div{ background: #eeeeee; border: 1px solid #aaa; width: 99%; ...

  6. [转]使用sklearn进行集成学习——实践

    转:http://www.cnblogs.com/jasonfreak/p/5720137.html 目录 1 Random Forest和Gradient Tree Boosting参数详解2 如何 ...

  7. Android自定义ListView的Item无法响应OnItemClick的解决办法(转)

    原文链接:http://www.linuxidc.com/Linux/2011-09/43205.htm 如果你的自定义ListViewItem中有Button或者Checkable的子类控件的话,那 ...

  8. python修行:练习购物车

    product_list = [ ('Iphone',5800), ('Mac Pro',9800), ('Bike',800), ('Watch',10600), ('Coffee',31), (' ...

  9. MySQL操作符

    简要介绍MySQL操作符 常用: 算术运算符.比较操作符.逻辑操作符.位运算符-- 一.算术运算符 +:加 -:减 *:乘 /:除,返回商 %,mod():除,返回余数 mysql> %,mod ...

  10. 深入理解MVC

    首先我们来看看MVC架构的示意图:             和访问者交互的是控制层(Controller层),控制器(controller)是同类交互的集合,每一个交互的操作,都对应了一个动作(act ...