java常用八大排序法

最近查资料发现java排序挺有意思的,其中包含常见八种具有代表性的排序法;笔者觉得排序的功能重要,但更重要的是排序的思想;所以简单叙述一下常见排序方法名称,并用代码举例。

A.插入排序(直接插入排序、希尔排序);
B.交换排序(冒泡排序、快速排序);
C.选择排序(直接选择排序、堆排序);
D.归并排序;
E.分配排序(基数排序);

所需辅助空间最多:归并排序;
所需辅助空间最少:堆排序;
平均速度最快:快速排序;

不稳定:快速排序,希尔排序,堆排序。

代码块:

package com.sinolife.mtrs.apply.controller;

import java.util.Arrays;

/**
* @author delin Li
* @version createTime:2017-12-7下午04:10:37
* @Description
*/
public class TestSort {

/**
* @param args
*/
public static void main(String[] args) {
int[] ins = {1,3,53,7,81,2,5,71,9};
// insertSort(ins);//直接插入排序
// shellSort(ins);//希尔排序,
// sampleSelectSort(ins);//简单选择排序
// heapSort(ins);//堆排序
// bubbleSort(ins);//冒泡 排序
// quikSort(ins,0,ins.length-1);//快速排序
// mergeSort(ins,0,ins.length-1);//归并排序
radixSort(ins,10,2);//基排序
print(ins);
}

public static void print(int[] data) {
for (int i = 0; i < data.length; i++) {
System.out.print(data[i] + " ");
}
}

//直接插入排序
/*public static void insertSort(int arg[]){
for(int i=1;i<arg.length;i++){//将第一个数当做已经排好序的值,然后将后边无序数依次插入到已经排好的列表中
int j;
int temp = arg[i];//插入的数值
for(j=i;temp<arg[j-1]&&j>0;j--){
arg[j] = arg[j-1];////通过循环,逐个后移一位找到要插入的位置。
}
arg[j]=temp;//插入
}
}*/

//希尔
/*public static void shellSort(int a[]){
int n = a.length;
for(int i = n/2;i>0; i /=2){
for(int j = i;j<n;j++){//每个元素与自己组内的数据进行直接插入排序
if(a[j]<a[j-i]){
int temp = a[j];
int k = j-i;
while(k>=0&&a[k]>temp){
a[k+i] = a[k];
k -=i;
}
a[k+i] = temp;
}
}
}
}*/

//简单选择排序
/*public static void sampleSelectSort(int[] a){
int minV;//临时保存最小值
int minI;//临时保存最小值下标
for(int i= 0;i<a.length-1;i++){
minV = a[i];
minI = i;
for(int j = i+1;j<a.length;j++){
if(a[j]<minV){
minV = a[j];
minI = j;
}
}
if(minV != a[i] && minI !=i){
a[minI] = a[i];
a[i] = minV;
}
}
}*/

//堆排序
/*public static void swap(int[] data, int i, int j) {
if (i == j) {
return;
}
data[i] = data[i] + data[j];
data[j] = data[i] - data[j];
data[i] = data[i] - data[j];
}

public static void heapSort(int[] data) {
for (int i = 0; i < data.length; i++) {
createMaxdHeap(data, data.length - 1 - i);
swap(data, 0, data.length - 1 - i);
print(data);
}
}

public static void createMaxdHeap(int[] data, int lastIndex) {
for (int i = (lastIndex - 1) / 2; i >= 0; i--) {
// 保存当前正在判断的节点
int k = i;
// 若当前节点的子节点存在
while (2 * k + 1 <= lastIndex) {
// biggerIndex总是记录较大节点的值,先赋值为当前判断节点的左子节点
int biggerIndex = 2 * k + 1;
if (biggerIndex < lastIndex) {
// 若右子节点存在,否则此时biggerIndex应该等于 lastIndex
if (data[biggerIndex] < data[biggerIndex + 1]) {
// 若右子节点值比左子节点值大,则biggerIndex记录的是右子节点的值
biggerIndex++;
}
}
if (data[k] < data[biggerIndex]) {
// 若当前节点值比子节点最大值小,则交换2者得值,交换后将biggerIndex值赋值给k
swap(data, k, biggerIndex);
k = biggerIndex;
} else {
break;
}
}
}
}*/

//冒泡排序
/*public static void bubbleSort(int[] a){
for (int i = 0; i < a.length-1; i++) {
for (int j = i; j < a.length-i-1; j++) {
if(a[j]>a[j+1]){
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}*/

//快速排序
/*public static void quikSort(int data[], int start, int end) {

if (end - start <= 0) {
return;
}
int last = start;
for (int i = start + 1; i <= end; i++) {
if (data[i] < data[start]) {
int temp = data[++last];
data[last] = data[i];
data[i] = temp;
}
}
int temp = data[last];
data[last] = data[start];
data[start] = temp;
quikSort(data, start, last - 1);
quikSort(data, last + 1, end);
}*/

//归并排序
/*public static void mergeSort(int data[], int start, int end) {
if (start < end) {
int mid = (start + end) / 2;
mergeSort(data, start, mid);
mergeSort(data, mid + 1, end);
merge(data, start, mid, end);
}
}

public static void merge(int data[], int start, int mid, int end) {
int temp[] = new int[end - start + 1];
int i = start;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= end) {
if (data[i] < data[j]) {
temp[k++] = data[i++];
} else {
temp[k++] = data[j++];
}
}

while (i <= mid) {
temp[k++] = data[i++];
}
while (j <= end) {
temp[k++] = data[j++];
}

for (k = 0, i = start; k < temp.length; k++, i++) {
data[i] = temp[k];
}
}*/

//基排序
public static void radixSort(int[] data, int radix, int d) {
// 缓存数组
int[] tmp = new int[data.length];
// buckets用于记录待排序元素的信息
// buckets数组定义了max-min个桶
int[] buckets = new int[radix];

for (int i = 0, rate = 1; i < d; i++) {

// 重置count数组,开始统计下一个关键字
Arrays.fill(buckets, 0);
// 将data中的元素完全复制到tmp数组中
System.arraycopy(data, 0, tmp, 0, data.length);

// 计算每个待排序数据的子关键字
for (int j = 0; j < data.length; j++) {
int subKey = (tmp[j] / rate) % radix;
buckets[subKey]++;
}
for (int j = 1; j < radix; j++) {
buckets[j] = buckets[j] + buckets[j - 1];
}
// 按子关键字对指定的数据进行排序
for (int m = data.length - 1; m >= 0; m--) {
int subKey = (tmp[m] / rate) % radix;
data[--buckets[subKey]] = tmp[m];
}
rate *= radix;
}

}

}

如有错误,请朋友们提出!

时间: 2024-11-08 05:27:56

java常用八大排序法的相关文章

Java实现八大排序算法

本文对常见的排序算法进行了总结. 常见排序算法如下: 直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 它们都属于内部排序,也就是只考虑数据量较小仅需要使用内存的排序算法,他们之间关系如下: 稳定与非稳定: 如果一个排序算法能够保留数组中重复元素的相对位置则可以被称为是 稳定 的.反之,则是 非稳定 的. 直接插入排序 基本思想 通常人们整理桥牌的方法是一张一张的来,将每一张牌插入到其他已经有序的牌中的适当位置.在计算机的实现中,为了要给插入的元素腾出空间,我

java之八大排序

的关系:  1.直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排 好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数 也是排好顺序的.如此反复循环,直到全部排好顺序. (2)实例  (3)用java实现 package com.njue; public class insertSort { public insertSort(){ inta[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98

Java常用的排序算法

转载自博客http://blog.csdn.net/xsf50717 排序算法 重要性不言而喻,很多算法问题往往选择一个好的排序算法往往问题可以迎刃而解 1.冒泡算法 冒泡排序(Bubble Sort)也是一种简单直观的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端.也就是双重循环就可以搞定的问题但是需

Java使用选择排序法对数组进行排序

1 package com.yzy.test; 2 3 public class Test { 4 5 /** 6 * @param args 7 */ 8 public static void main(String[] args) { 9 int[] array = { 43, 64, 21, 6565, 3424, 22, 6523, 345 }; 10 for (int i = 1; i < array.length; i++) { 11 int index = 0; 12 for (i

Java实现八大排序之冒泡排序

冒泡排序 冒泡排序的定义: 冒泡排序(Bubble Sort)它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端.(定义来自百度百科).简单的说就是持续交换两个元素,直到数列变有序. 冒泡排序的算法思想: 比较相邻的元素,如果第一个比第二个元素要大,则交换这两个数.对每对相邻的元素进行同样的工作,从第一对到最后一对

Java 常用的排序算法【选择、冒泡、快排】

选择排序: 简述:从数组的第一个元素开始,依次与其他所有的元素对比,如果比自身大或小(取决于升序或降序)交换位置. ChiceSort Code 冒泡排序: 简述:比较数组中两个相邻的元素,如果前者比较大则交换位置.像啤酒杯中的气泡一样,先漂上来最大的气泡,再漂上来第二大的气泡......... BubbleSort Code 快速排序: 简述:寻找一个基准(数组中的第一个或最后一个),表的两端同时向中间扫描,小在左,大在右.然后分别从基准两边进行递归排序. QuickSortCode 原文地址

Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法

Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序. 先来看看 8种排序之间的关系: 1.直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2]

常用的八大排序算法,含java实例(copy)

说明:转载于http://www.cnblogs.com/qqzy168/archive/2013/08/03/3219201.html 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序. 先来看看 8种排序之间的关系: 1.直接插入排序 (1)基本思想:在要排序的一组数中

[转载]图解程序员必须掌握的Java常用8大排序算法

这篇文章主要介绍了Java如何实现八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 .快速排序.归并排序.堆排序和LST基数排序,分享给大家一起学习. 分类1)插入排序(直接插入排序.希尔排序)2)交换排序(冒泡排序.快速排序)3)选择排序(直接选择排序.堆排序)4)归并排序5)分配排序(基数排序) 所需辅助空间最多:归并排序所需辅助空间最少:堆排序平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序. 先来看看8种排序之间的关系: 1.直接插入排序 (1)基本思想:在要排序的一