在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. Android -- onMeasure()源码分析

    1,作为自定义控件最重要的三个方法之一,onMeasure()可以说是我们研究的重点,今天我们更详细的来研究一下View的onMeasure()方法和ViewGroup的onMeasure()方法 2 ...

  2. 踩坑实录 使用 cardview 时报错 error: No resource identifier found for attribute 'cardCornerRadius' in package 'com.xxxxx.xxx'

    在项目中引用 cardview 卡片布局,编译时 Android Studio 报出下面图片中红框标记的错误: 出现这种情况的原因在于没有导入 cardview 卡片布局相应的依赖包,因此我们需要在 ...

  3. Truncated incorrect DOUBLE value错误

    mysql报错:Truncated incorrect DOUBLE value sql的update语法错误eg: update Person set name = 'auhnayuiL' and ...

  4. [SinGuLaRiTy] COCI 2016~2017 #5

    [SinGuLaRiTy-1012] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 最近神犇喜欢考COCI...... 测试题目 对于所有的 ...

  5. QTP自动化测试培训:描述编程之WebElement

    QTP自动化测试培训:描述编程之WebElement   通过描述性编程技术,来描述出来输入框: set po=browser("creationtime:=0").page(&q ...

  6. 使用cocapods报错 [!] Your Podfile has had smart quotes sanitised. To avoid issues in the future, you should not use TextEdit for editing it. If you are not using TextEdit, you should turn off smart quotes

    从github上下载的工程大部分都使用了cocapods,在install的时候可能会报错. 报错原因: 1.不要使用文本编辑去编辑Podfile文件,使用Xcode编辑,或者使用终端敲命令去编辑. ...

  7. BootstrapBootbox居中

    /* 模态框居中样式 */ .bootbox-container { position: fixed; ; ; ; ; ; overflow-y: auto; } .bootbox-container ...

  8. rxjava2学习笔记(1)

    1.什么是RxJava? 简单,清晰的多线程编程框架.可方便的写出维护性高,逻辑清晰的Java程序. 2.什么是观察者模式? 入门教程讲这种高大上抽象概念都是耍流氓! 3.开始 3.1github地址 ...

  9. Myeclipse快捷键以及使用技巧大全-来自网络

    1. 打开MyEclipse 6.0.1,然后"window"→"Preferences" 2. 选择"java",展开,"Edi ...

  10. 机器学习-scikit learn学习笔记

    scikit-learn官网:http://scikit-learn.org/stable/ 通常情况下,一个学习问题会包含一组学习样本数据,计算机通过对样本数据的学习,尝试对未知数据进行预测. 学习 ...