public class MySort {
final int MAX=20;
int num[]=new int[MAX];
{
System.out.print("生成的随机数组是:");
for(int i=0;i<20;i++){
num[i]=(int)(Math.random()*100);
System.out.print(num[i]+" ");
}
System.out.println();
} int num2[]=new int[MAX]; //只用于合并排序法中
{
System.out.print("合并排序法需要使用的数组2是:");
for(int i=0;i<20;i++){
num2[i]=(int)(Math.random()*100);
System.out.print(num2[i]+" ");
}
System.out.println();
} int num3[]=new int[MAX+MAX]; //用于存放合并排序法中被合并排序好的数组 public MySort(){
selsort(num.clone()); //选择排序法
insort(num.clone()); //插入排序法
bubsort(num.clone()); //冒泡排序法
shellsort(num.clone()); //希尔排序法
shakersort(num.clone()); //shake排序法
heapsort(num.clone()); //堆排序
quicksort_one(num.clone()); //快速排序法(一)
quicksort_two(num.clone()); //快速排序法(二)
quicksort_three(num.clone()); //快速排序法(三)
mergesort(num.clone(),num2.clone(),num3); //合并排序法
basesort(num.clone()); //基数排序法
} /*----------------------------选择排序法-------------------------------------------
将要排序的对象分作两部份,一个是已排序的,一个是未排序的,从后端未排序部份选择一个最小值,并放入前端已排序部份的最后一个。
-------------------------------------------------------------------------------*/
public void selsort(int number[]) {
int i, j, k, m, temp;
long start,end; start=System.nanoTime();
for(i = 0; i < MAX-1; i++) {
m = i;
for(j = i+1; j < MAX; j++){
if(number[j] < number[m]){
m = j;
}
}
if( i != m){
temp=number[i];
number[i]=number[m];
number[m]=temp;
}
}
end=System.nanoTime(); System.out.println("-----------------选择排序法------------------");
System.out.print("排序后是:");
for(i=0;i<=MAX-1;i++){
System.out.print(number[i]+" ");
}
System.out.println();
System.out.println("排序使用时间:"+(end-start)+" ns");
} /*-------------------------插入排序法--------------------------------
像是玩朴克一样,我们将牌分作两堆,每次从后面一堆的牌抽出最前端的牌,然后插入前面一堆牌的适当位置
-----------------------------------------------------------------*/
public void insort(int number[]){
int i, j, k, temp;
long start,end; start=System.nanoTime();
for(j = 1; j < MAX; j++) {
temp = number[j];
i = j - 1;
while(temp < number[i]) {
number[i+1] = number[i];
i--;
if(i == -1){
break;
}
}
number[i+1] = temp;
}
end=System.nanoTime(); System.out.println("-----------------插入排序法------------------");
System.out.print("排序后是:");
for(i=0;i<=MAX-1;i++){
System.out.print(number[i]+" ");
}
System.out.println();
System.out.println("排序使用时间:"+(end-start)+" ns");
} /*-----------------------------------------冒泡排序法----------------------------------------
顾名思义,就是排序时,最大的元素会如同气泡一样移至右端,其利用比较相邻元素的方法,将大的元素交换至右端,
所以大的元素会不断的往右移动,直到适当的位置为止。
基本的气泡排序法可以利用旗标的方式稍微减少一些比较的时间,当寻访完阵列后都没有发生任何的交换动作,
表示排序已经完成,而无需再进行之后的回圈比较与交换动作。
----------------------------------------------------------------------------------------*/
public void bubsort(int number[]){
int i, j, k, temp, flag = 1;
long start,end; start=System.nanoTime();
for(i = 0; i < MAX-1 && flag == 1; i++) {
flag = 0;
for(j = 0; j < MAX-i-1; j++) {
if(number[j+1] < number[j]) {
temp=number[j+1];
number[j+1]=number[j];
number[j]=temp;
flag = 1;
}
}
}
end=System.nanoTime(); System.out.println("-----------------冒泡排序法------------------");
System.out.print("排序后是:");
for(i=0;i<=MAX-1;i++){
System.out.print(number[i]+" ");
}
System.out.println();
System.out.println("排序使用时间:"+(end-start)+" ns");
} /*--------------------------shell(希尔)排序法----------------------------
Shell首先将间隔设定为n/2,然后跳跃进行插入排序,再来将间隔n/4,跳跃进行排序动作,再来
间隔设定为n/8、n/16,直到间隔为1之后的最后一次排序终止,由于上一次的排序动作都会将
固定间隔内的元素排序好,所以当间隔越来越小时,某些元素位于正确位置的机率越高,因此
最后几次的排序动作将可以大幅减低。
---------------------------------------------------------------------*/
public void shellsort(int number[]) {
int i, j, k, gap, temp;
long start,end; start=System.nanoTime();
gap = MAX / 2;
while(gap > 0) {
for(k = 0; k < gap; k++) {
for(i = k+gap; i < MAX; i+=gap) {
for(j = i - gap; j >= k; j-=gap) {
if(number[j] > number[j+gap]) {
temp=number[j];
number[j]=number[j+gap];
number[j+gap]=temp;
}else{
break;
}
}
}
}
gap /= 2;
}
end=System.nanoTime(); System.out.println("-----------------shell(希尔)排序法(改进的插入排序法)------------------");
System.out.print("排序后是:");
for(i=0;i<=MAX-1;i++){
System.out.print(number[i]+" ");
}
System.out.println();
System.out.println("排序使用时间:"+(end-start)+" ns");
} /*---------------------Shake排序法(改良的冒泡排序法)--------------------------
方法就在于气泡排序的双向进行,先让气泡排序由左向右进行,再来让气泡排序由右往左进行,
如此完成一次排序的动作,而您必须使用left与right两个旗标来记录左右两端已排序的元素位置。
--------------------------------------------------------------------*/
public void shakersort(int number[]) {
int i, temp, left = 0, right = MAX - 1, shift = 0;
long start,end; start=System.nanoTime();
while(left < right) {
// 向右進行氣泡排序
for(i = left; i < right; i++) {
if(number[i] > number[i+1]) {
temp=number[i];
number[i]=number[i+1];
number[i+1]=temp;
shift = i;
}
}
right = shift; // 向左進行氣泡排序
for(i = right; i > left; i--) {
if(number[i] < number[i-1]) {
temp=number[i];
number[i]=number[i-1];
number[i-1]=temp;
shift = i;
}
}
left = shift;
}
end=System.nanoTime(); System.out.println("-----------------shake排序法(改进的冒泡排序法)------------------");
System.out.print("排序后是:");
for(i=0;i<=MAX-1;i++){
System.out.print(number[i]+" ");
}
System.out.println();
System.out.println("排序使用时间:"+(end-start)+" ns");
} /*-----------------------heap排序(堆排序法--改进的选择排序)----------------------------
利用堆积树的原理,先构造一个堆积树(看堆积树的定义,笔记本上有),然后将根节点与最后的叶子节点交换,并屏蔽掉最后一个叶子节点,
然后再将未被屏蔽的部分重新构造堆积树,然后再重复上面的步骤,直到所有的数被按顺序排好。
--------------------------------------------------------------------------------*/
public void heapsort(int number[]) {
int i, m, p, s, temp;
long start,end; start=System.nanoTime();
int number_temp[]=new int[MAX+1];
for(int temp_i=1;temp_i<MAX+1;temp_i++){
number_temp[temp_i]=number[temp_i-1];
}
createheap(number_temp);
m = MAX;
while(m > 1) {
temp=number_temp[1];
number_temp[1]=number_temp[m];
number_temp[m]=temp;
m--;
p = 1;
s = 2 * p;
while(s <= m) {
if(s < m && number_temp[s+1] > number_temp[s])
s++;
if(number_temp[p] >= number_temp[s])
break;
temp=number_temp[p];
number_temp[p]=number_temp[s];
number_temp[s]=temp;
p = s;
s = 2 * p;
}
}
for(int temp_j=1;temp_j<MAX+1;temp_j++){
number[temp_j-1]=number_temp[temp_j];
}
end=System.nanoTime(); System.out.println("-----------------heap排序(堆排序法--改进的选择排序)------------------");
System.out.print("排序后是:");
for(i=0;i<=MAX-1;i++){
System.out.print(number[i]+" ");
}
System.out.println();
System.out.println("排序使用时间:"+(end-start)+" ns");
} //将原数组构造为从下标1开始的一个新数组,便于处理,同时将这个新数组构造为最初始的堆积树结构
public void createheap(int number[]) {
int i, s, p, temp;
int heap[] = new int[MAX+1];
for(i = 1; i <= MAX; i++) {
heap[i] = number[i];
s = i;
p = i / 2;
while(s >= 2 && heap[p] < heap[s]) {
temp=heap[p];
heap[p]=heap[s];
heap[s]=temp;
s = p;
p = s / 2;
}
}
for(i = 1; i <= MAX; i++){
number[i] = heap[i];
}
} /*-----------------------快速排序法(一)---------------------------------------------
这边所介绍的快速演算如下:将最左边的数设定为轴,并记录其值为s
廻圈处理:
令索引i 从数列左方往右方找,直到找到大于s 的数
令索引j 从数列左右方往左方找,直到找到小于s 的数
如果i >= j,则离开回圈
如果i < j,则交换索引i与j两处的值
将左侧的轴与j 进行交换
对轴左边进行递回
对轴右边进行递回
--------------------------------------------------------------------------------*/
public void quicksort_one(int number[]){
long start,end; start=System.nanoTime();
quicksort_1(number,0,MAX-1);
end=System.nanoTime(); System.out.println("-----------------快速排序法( 一 )------------------");
System.out.print("排序后是:");
for(int i=0;i<=MAX-1;i++){
System.out.print(number[i]+" ");
}
System.out.println();
System.out.println("排序使用时间:"+(end-start)+" ns"); } public void quicksort_1(int number[],int left,int right) {
int i, j, s, temp;
if(left < right) {
s = number[left];
i = left;
j = right + 1;
while(true) {
// 向右找
while(i + 1 < number.length && number[++i] < s) ;
// 向左找
while(j -1 > -1 && number[--j] > s) ;
if(i >= j)
break;
temp=number[i];
number[i]=number[j];
number[j]=temp;
}
number[left] = number[j];
number[j] = s;
quicksort_1(number, left, j-1); // 对左边进行递回
quicksort_1(number, j+1, right); // 对右边进行递回
}
} /*-----------------------快速排序法(二)---------------------------------------------
在这个例子中,取中间的元素s作比较,同样的先得右找比s大的索引i,然后找比s小的
索引j,只要两边的索引还没有交会,就交换i 与j 的元素值,这次不用再进行轴的交换了,
因为在寻找交换的过程中,轴位置的元素也会参与交换的动作,例如:
41 24 76 11 45 64 21 69 19 36
首先left为0,right为9,(left+right)/2 = 4(取整数的商),所以轴为索引4的位置,比较的元素是
45,您往右找比45大的,往左找比45小的进行交换:
41 24 76* 11 [45] 64 21 69 19 *36
41 24 36 11 45* 64 21 69 19* 76
41 24 36 11 19 64* 21* 69 45 76
[41 24 36 11 19 21] [64 69 45 76]
完成以上之后,再初别对左边括号与右边括号的部份进行递回,如此就可以完成排序的目的。
--------------------------------------------------------------------------------*/
public void quicksort_two(int number[]){
long start,end; start=System.nanoTime();
quicksort_2(number,0,MAX-1);
end=System.nanoTime(); System.out.println("-----------------快速排序法( 二 )------------------");
System.out.print("排序后是:");
for(int i=0;i<=MAX-1;i++){
System.out.print(number[i]+" ");
}
System.out.println();
System.out.println("排序使用时间:"+(end-start)+" ns");
} public void quicksort_2(int number[], int left, int right) {
int i, j, s, temp;
if(left < right) {
s = number[(left+right)/2];
i = left - 1;
j = right + 1;
while(true) {
while(number[++i] < s) ; // 向右找
while(number[--j] > s) ; // 向左找
if(i >= j)
break;
temp=number[i];
number[i]=number[j];
number[j]=temp;
}
quicksort_2(number, left, i-1); // 对左边进行递回
quicksort_2(number, j+1, right); // 对右边进行递回
}
} /*-----------------------快速排序法(三)---------------------------------------------
先说明这个快速排序法的概念,它以最右边的值s作比较的标准,将整个数列分为三个部份,
一个是小于s的部份,一个是大于s的部份,一个是未处理的部份,如下所示:
i j
--------|-----------|----------|s
小于s 大于s 未处理
在排序的过程中,i 与j 都会不断的往右进行比较与交换,最后数列会变为以下的状态:
-------------|-----------------|s
小于s 大于s
然后将s的值置于中间,接下来就以相同的步骤会左右两边的数列进行排序的动作,如下所示:
-------------|s|---------------
小于s 大于s
然后采用递归的方法重复上面的步骤,就可以实现排序了。
--------------------------------------------------------------------------------*/
public void quicksort_three(int number[]){
long start,end; start=System.nanoTime();
quicksort_3(number,0,MAX-1);
end=System.nanoTime(); System.out.println("-----------------快速排序法( 三 )------------------");
System.out.print("排序后是:");
for(int i=0;i<=MAX-1;i++){
System.out.print(number[i]+" ");
}
System.out.println();
System.out.println("排序使用时间:"+(end-start)+" ns"); } public int partition(int number[], int left, int right) {
int i, j, s, temp;
s = number[right];
i = left - 1;
for(j = left; j < right; j++) {
if(number[j] <= s) {
i++;
temp=number[i];
number[i]=number[j];
number[j]=temp;
}
}
temp=number[i+1];
number[i+1]=number[right];
number[right]=temp;
return i+1;
} public void quicksort_3(int number[], int left, int right) {
int q;
if(left < right) {
q = partition(number, left, right);
quicksort_3(number, left, q-1);
quicksort_3(number, q+1, right);
}
} /*-----------------------合并排序法---------------------------------------------
合并排序法基本是将两笔已排序的资料合并并进行排序,如果所读入的资料尚未排序,
可以先利用其它的排序方式来处理这两笔资料,然后再将排序好的这两笔资料合并。
合并排序法中用到了 快速排序法(三)
--------------------------------------------------------------------------------*/ public void mergesort(int number1[],int number2[],int number3[]){
long start,end; start=System.nanoTime();
quicksort_3(number1,0,MAX-1);
quicksort_3(number2,0,MAX-1);
mergesort_merge(number1,MAX,number2,MAX,number3);
end=System.nanoTime(); System.out.println("-----------------合并排序法------------------");
System.out.print("排序后是:");
for(int i=0;i<=MAX+MAX-1;i++){
System.out.print(number3[i]+" ");
}
System.out.println();
System.out.println("排序使用时间:"+(end-start)+" ns");
} public void mergesort_merge(int number1[], int M, int number2[], int N, int number3[]) {
int i = 0, j = 0, k = 0;
while(i < M && j < N) {
if(number1[i] <= number2[j]){
number3[k++] = number1[i++];
}else{
number3[k++] = number2[j++];
}
}
while(i < M){
number3[k++] = number1[i++];
}
while(j < N){
number3[k++] = number2[j++];
}
} /*-----------------------基数排序法---------------------------------------------
基数排序的方式可以采用LSD(Least sgnificant digital)或MSD(Most sgnificant digital),
LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。
以LSD为例,假设原来有一串数值如下所示:
73, 22, 93, 43, 55, 14, 28, 65, 39, 81
首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中:
0 1 2 3 4 5 6 7 8 9
81 65 39
43 14 55 28
93
22 73
接下来将这些桶子中的数值重新串接起来,成为以下的数列:
81, 22, 73, 93, 43, 14, 55, 65, 28, 39
接着再进行一次分配,这次是根据十位数来分配:
接下来将这些桶子中的数值重新串接起来,成为以下的数列:
0 1 2 3 4 5 6 7 8 9
28 39
14 22 43 55 65 73 81 93
14, 22, 28, 39, 43, 55, 65, 73, 81, 93
这时候整个数列已经排序完毕;如果排序的对象有三位数以上,则持续进行以上的动作直至最
高位数为止。
LSD的基数排序适用于位数小的数列,如果位数多的话,使用MSD的效率会比较好,MSD的方
式恰与LSD相反,是由高位数为基底开始进行分配,其他的演算方式则都相同。
--------------------------------------------------------------------------------*/
public void basesort(int number[]){
int temp[][] = new int[MAX][MAX];
int order[] = new int[MAX];
int i, j, k, n, lsd;
long start,end;
k = 0;
n = 1; start=System.nanoTime();
while(n <= 10) {
for(i = 0; i < MAX; i++) {
lsd = ((number[i] / n) % 10);
temp[lsd][order[lsd]] = number[i];
order[lsd]++;
}
//重新排列
for(i = 0; i < MAX; i++) {
if(order[i] != 0)
for(j = 0; j < order[i]; j++) {
number[k] = temp[i][j];
k++;
}
order[i] = 0;
}
n *= 10;
k = 0;
}
end=System.nanoTime(); System.out.println("-----------------基数排序法------------------");
System.out.print("排序后是:");
for(int ii=0;ii<=MAX-1;ii++){
System.out.print(number[ii]+" ");
}
System.out.println();
System.out.println("排序使用时间:"+(end-start)+" ns");
} public static void main(String[] args){
System.out.println("以下的测试时间仅供参考...");
new MySort();
} }

几种常见的排序算法Java实现总结的更多相关文章

  1. java讲讲几种常见的排序算法(二)

    java讲讲几种常见的排序算法(二) 目录 java讲讲几种常见的排序算法(一) java讲讲几种常见的排序算法(二) 堆排序 思路:构建一个小顶堆,小顶堆就是棵二叉树,他的左右孩子均大于他的根节点( ...

  2. java讲讲几种常见的排序算法

    java讲讲几种常见的排序算法(一) 目录 java讲讲几种常见的排序算法(一) java讲讲几种常见的排序算法(二) 以数组array={6,3,20,8,15,1}为例 冒泡排序 思路:从第0个到 ...

  3. java几种常见的排序算法总结

    /*************几种常见的排序算法总结***************************/ package paixu; public class PaiXu { final int  ...

  4. 七种常见经典排序算法总结(C++实现)

    排序算法是非常常见也非常基础的算法,以至于大部分情况下它们都被集成到了语言的辅助库中.排序算法虽然已经可以很方便的使用,但是理解排序算法可以帮助我们找到解题的方向. 1. 冒泡排序 (Bubble S ...

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

    python3实现几种常见的排序算法 冒泡排序 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来.走访数列的工作是重复地进行直到没有再需要 ...

  6. Python全栈开发之5、几种常见的排序算法以及collections模块提供的数据结构

    转载请注明出处http://www.cnblogs.com/Wxtrkbc/p/5492298.html 在面试中,经常会遇到一些考排序算法的题,在这里,我就简单了列举了几种最常见的排序算法供大家学习 ...

  7. 用php实现四种常见的排序算法

    几种常见的排序 排序是一个程序员的基本功,对于初级phper,更是可以通过排序算法来锻炼自己的思维能力. 所谓排序,就是对一组数据,按照某个顺序排列的过程.下面就总结四种常用的php排序算法,分别是冒 ...

  8. Java几种常见的排序算法

    一.所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法.排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面. ...

  9. 七种常见经典排序算法总结(C++)

    最近想复习下C++,很久没怎么用了,毕业时的一些经典排序算法也忘差不多了,所以刚好一起再学习一遍. 除了冒泡.插入.选择这几个复杂度O(n^2)的基本排序算法,希尔.归并.快速.堆排序,多多少少还有些 ...

随机推荐

  1. 《Maven实战》笔记-9-版本管理

    一.理想的发布版本,在项目构建时需要满足以下条件: 1.所有自动化测试应当全部通过: 2.项目没有配置任何快照版本的依赖: 3.项目没有任何快照版本的插件: 4.项目所包含的代码已经全部提交到版本控制 ...

  2. [raspberry pi3] opensuse使用splash中问题处理

    问题一: QXcbConnection: Could not connect to display :1594410864 解决方案: export QT_QPA_PLATFORM=offscreen

  3. 霍尼韦尔1450g二维码扫码枪中文识别。

    USB接口模拟COM串口驱动程序 HSM USB Serial Driver 链接: https://pan.baidu.com/s/1aOV-Fz0OYdQGc5dMmkHzgg 提取码: fwgt ...

  4. UINavigationController + UIScrollView组合,视图尺寸的设置探秘(三)

    还是在苹果的 View Controller Catalog for iOS 文章中找到答案.文中提到了两点: 1.If the navigation bar or toolbar are visib ...

  5. 洛谷P3648 [APIO2014]序列分割(斜率优化)

    传送门 没想到这种多个状态转移的还能用上斜率优化……学到了…… 首先我们可以发现,切的顺序对最终答案是没有影响的 比方说有一个序列$abc$,每一个字母都代表几个数字,那么先切$ab$再切$bc$,得 ...

  6. HiBench学习笔记

    HiBench资源及教程:https://github.com/intel-hadoop/HiBench 介绍: Hadoop新人 环境 linux 该笔记针对英语弱鸡&自己在使用过程用遇到的 ...

  7. 【模板】缩点 tarjan+dp

    题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只 ...

  8. 如何进bat

    既然是要谈如何进入BAT,那么咱们就从面试的角度来谈学习这件事,会谈谈一流互联网公司对于Java后端程序员的要求,相应的,也会谈谈如何达到这样的要求. 为了简单起见,这些要求分为三个层次,分别为基本要 ...

  9. 【Cracking the Code Interview(5th edition)】一、数组与字符串(C++)

    1.1 实现一个算法,确定一个字符串的所有字符是否全都不同.不允许使用额外的数据结构. 解答:这里假定字符集为ASCII码,可以与面试官沟通确认字符串使用的字符集.由于字符集是有限的,建立一个数组模拟 ...

  10. django组件之中间件

    中间件的概念 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影响到 ...