文章目录

  • 1.直接插入排序
  • 2.希尔排序
  • 3.冒泡排序
  • 4.快速排序
  • 5.选择排序
  • 6.堆排序
  • 7.归并排序

1.直接插入排序

public class DifferentSort {public static void main(String[] args) {Insert insert = new Insert();insert.sort();}
}
class Insert {int total;int[] data = new int[10];Insert() {Random random = new Random();for (int i = 0; i < 10; i++)data[i] = random.nextInt() %100;}void sort() {total = 10;int j;int temp;for (int i = 1; i < total; i++) {temp = this.data[i];j = i - 1;//  System.out.println(j);while (data[j] > temp && j >=0) {data[j+1] = data[j];j--;if(j < 0) break;}data[j+1] = temp;}for (int i = 1; i < total; i++)System.out.println(data[i]);}
}


2.希尔排序

插入排序的改进版,插入排序当序列为正序或基本有序时时间复杂度为o(n),希尔排序的基本思想:待排序列划分为若干组,每组内进行直接插入排序,然后再对整个序列直接排序
步长的变化:1<dl<=n/2
初始步长可以直接决定希尔排序的性能

class  Shell{int total;int[] data = new int[10];Shell() {total = 10;Random random = new Random();for (int i = 0; i < 10; i++)data[i] = random.nextInt(100) %60;for (int i = 0; i < 10; i++)System.out.print(data[i]+",");}public void shell_sort(){int temp;int j;int dl = this.total/2;//初始步长while(dl >=1){for(int i = 1+dl;i < total;i++){temp = data[i];j = i-dl;while (j>=0 && data[j] > temp){data[j+dl] =data[j];j = j-dl;if(j < 0) break;}data[j+dl] = temp;}dl  = dl/2;}System.out.println("希尔排序后");for (int i = 1; i < total; i++)System.out.print(data[i]+",");}}

结果:
18,29,29,48,12,17,15,0,0,33,希尔排序后
0,0,12,15,17,29,29,33,48,
改数字为十万后:

3.冒泡排序

每一次都浮上来最小的元素,是稳定的排序算法
以下用exchange作为标记,如果为false表示已经排序完成,可以不再执行下一次循环

class pop{int total = 100000;int[] data = new int[total];pop() {Random random = new Random();for (int i = 0; i < total; i++)data[i] = random.nextInt() % 60000;for (int i = 0; i < total; i++)System.out.print(data[i] + ",");}public void pop_sort() {boolean exchange = false;
for(int i = 1;i < total;i++)
{for(int j = total-1;j >= i;j--){if(data[j] < data[j-1]){exchange = true;int temp = data[j];data[j]= data[j-1];data[j-1] = temp;}}if(exchange == false) break;
}System.out.println("冒泡排序后");for (int i = 1; i < total; i++)System.out.print(data[i]+",");}
}

结果:

明显看出来冒泡排序实在太慢,与希尔排序相比差了有五十倍

4.快速排序

首先选一个元素作为中间元素,然后对两边进行同样的操作,递归进行

class Quick{Integer partion;int total = 10000;//Integer n = 100;解析为 Integer num = Integer.valueOf(100);//valueOf(参数)方法其实调用的是 new Integer(100);int[]data= new int[total];int n = 0;Quick(){Random random = new Random();for (int i = 0; i < total; i++)data[i] = random.nextInt(1000) %1000;for (int i = 0; i < total; i++)System.out.print(data[i]+",");}public Integer getN(){return this.n;}public Integer get(){return this.total;}public int part(int begin,int end){int temp;temp = data[begin];int i = begin,j = end;while (i != j){while(i <j &&data[j] > temp) {j--;}if(i < j){data[i] = data[j];//data[j]填补到空位中,交换i++;}while (data[i] < temp && i < j){i++;}if(i < j){data[j] = data[i];j--;//填补到后面的空位中}}data[i] = temp;//最终temp的位置return i;}public void Quick_sort(int n,int total){// Integer i = new Integer(10);if(n < total){int partnum =  part(n,total);Quick_sort(n,partnum-1);Quick_sort(partnum+1,total);}else {return;}}public void display(){System.out.println("快速排序后");for (int i = 1; i < total; i++)System.out.print(data[i]+",");}
}public static void main(String[] args) {long now = System.currentTimeMillis();
Quick quick = new Quick();quick.Quick_sort(quick.getN(),quick.get()-1);
quick.display();
long now2 = System.currentTimeMillis();System.out.println();System.out.println(now2-now+"ms");}

排十万个数字:

目前的话看得出快速排序比希尔排序更快,性能是最好的。
另外在这里尝试了用Integer,发现会导致程序死循环,原因还未查明,应该跟它的数字范围有关

5.选择排序

关键思想:每一次都把关键字最小或最大的元素放在最终位置上,选择排序包括堆排序和直接选择排序
直接选择排序通过待排子表中完整地比较一遍以确定最大或最小元素,并放在子表的最前面/最后面

class choose{int total = 100000;int[] data = new int[total];choose(){Random random = new Random();for (int i = 0; i < total; i++)data[i] = random.nextInt(10000) % 10000;for (int i = 0; i < total; i++)System.out.print(data[i] + ",");}public void choose_sort(){int min = Integer.MAX_VALUE;for(int i = 0;i < total-1;i++){min = i;for(int j = i+1;j < total;j++){if(data[j] < data[min]){min = j;}}if(min != i){int temp = data[i];data[i] = data[min];data[min] = temp;}}System.out.println("选择排序后:");for (int i = 1; i < total; i++)System.out.print(data[i]+",");}
}public static void main(String[] args) {long now = System.currentTimeMillis();
choose choose1 = new choose();
choose1.choose_sort();long now2 = System.currentTimeMillis();System.out.println();System.out.println(now2-now+"ms");}

结果:

6.堆排序

可以分两种情况分别讨论
①如果初始序列是堆,则可通过反复执行如下操作而最终得到一个有序序列
输出根:即将根(第一个元素)与当前子序列中的最后一个元素交换。
调整堆:将输出根之后的子序列调整为堆(元素个数比输出前少1个)元
②如果初始序列不是堆,则首先要将其先建成堆然后再按①的方式来实现
现在的问题是:如何由一个无序序列建成一个堆?
事实上,由无序序列建堆可通过反复调用筛选作来实现。为此需满足筛选的条件,即左右子树必须为堆。因此,建堆过程要从下往上逐子树地进行筛选。从易于编程的角度出发,根的下标自然是按从大到小,即按照根的下标从2到1的次序调整各子树为堆。
由初始序列(12,15,30,80,100,46,78,3390,86,64,55,120,230,45)建堆的过程如图11-9所示。

最终得到的堆:
(230,100,120,90,86,55,7833,80,15,64,12,46,30,45)


代码:

class Heap{int total = 100000;//Integer n = 100;解析为 Integer num = Integer.valueOf(100);//valueOf(参数)方法其实调用的是 new Integer(100);int[]data= new int[total];Heap(){Random random = new Random();for (int i = 0; i < total; i++)data[i] = random.nextInt(10000) %10000;for (int i = 0; i < total; i++)System.out.print(data[i]+",");}public void build(int begin,int end){//建立大根堆//end为最大元素下标//调整数组以begin为根的子树序列为根,其中最大的元素下标为end//假设以2k和2k+1为根的左右子树均为堆int i = begin;boolean finished = false;int j = 2*i;int temp = this.data[i];while(j<= end && !finished){if(j+1<=end && this.data[j+1] > this.data[j])j = j+1;//指向左右孩子的最大值if(this.data[i] < this.data[j]){this.data[i] = this.data[j];i = j;j = 2*j;}else finished = true;//如果原根最大,筛选结束}this.data[i] = temp;//原根的值填充到所搜索的当前空位置中}public void heap_sort(){for(int i = (total-1)/2;i>=0;i--){build(i,total-1);//建立初始堆}System.out.println();for(int i = total-1;i>=1;i--){int temp = this.data[0];this.data[0] = this.data[i];this.data[i] = temp;//先输出根build(0,i-1);//调整子序列data[0..i-1]};System.out.println("堆排序后");for (int i = 0; i < total; i++)System.out.print(data[i]+",");}
}public static void main(String[] args) {long now = System.currentTimeMillis();
Heap heap=new Heap();
heap.heap_sort();long now2 = System.currentTimeMillis();System.out.println();System.out.println(now2-now+"ms");}

结果:

7.归并排序

 public static void main(String[] args) {long now = System.currentTimeMillis();
Merge merge = new Merge();
merge.merge_operation(0,merge.get()-1);System.out.println();for (int i = 0; i < merge.get(); i++)System.out.print(merge.data[i]+",");
long now2 = System.currentTimeMillis();System.out.println();System.out.println(now2-now+"ms");}
class Merge{int total = 100000;public int[]data= new int[total];Merge(){Random random = new Random();for (int i = 0; i < total; i++)data[i] = random.nextInt(10000) %10000;for (int i = 0; i < total; i++)System.out.print(data[i]+",");}public Integer get(){return this.total;}public void merge(int low, int mid, int high){int i = low;int j = mid + 1;int []tmp = new int[high - low +1];//分配足够空间int k = 0;while(j <= high && i <= mid){if(data[i] >data[j]){tmp[k++] = data[j++];}else tmp[k++] = data[i++];}while(j <= high)tmp[k++] = data[j++];while(i <= mid)tmp[k++] = data[i++];for(int k1 = 0;k1 < k;k1++)data[low+k1] = tmp[k1];}public void merge_operation(int low,int high) {if (low < high) {int mid =(low + high)/2;merge_operation(low,mid);merge_operation(mid+1,high);merge(low,mid,high);}}
}

结果

还是比较快的,时间复杂度是o(nlogn)

【数据结构】用java实现不同的七种排序算法和性能比较相关推荐

  1. java 算法 排序算法_Java七种排序算法以及实现

    Java常见七种排序算法以及实现 最近学习一些排序算法,怕自己以后忘记就打算整理起来供自己复习 萌新一枚学习Java没多久,以下仅供参考.如有错误希望大佬指正,欢迎大家在评论区交流探讨. 1.冒泡排序 ...

  2. java中常用的几种排序算法--常见笔试面试

    转载:http://blog.csdn.net/ygc87/article/details/7208082 以下列出Java中常用的几种排序算法,只是简单实现了排序的功能,还有待改进,望指教(以下均假 ...

  3. 七种排序算法(C++)

    排序算法 引言 冒泡排序 简单选择排序 直接插入排序 希尔排序 堆排序 归并排序 快速排序 引言 排序中主要包含数据元素的比较和交换,本文以C++实现以下七种排序算法,以从小到大排序为例. 如有错误, ...

  4. 数据结构(三) 用java实现七种排序算法。

    很多时候,听别人在讨论快速排序,选择排序,冒泡排序等,都觉得很牛逼,心想,卧槽,排序也分那么多种,就觉得别人很牛逼呀,其实不然,当我们自己去了解学习后发现,并没有想象中那么难,今天就一起总结一下各种排 ...

  5. 数据结构常用的七种排序算法总结

    前言 排序算法在数据结构里属于最为重要的一部分,例如我们熟悉的冒泡.选择.插入.归并等,这些当初在第一次学习的时候,并没有很好的掌握,现在因为在备战考研,刚刚进行完数据结构的一轮简单复习在开始整理一轮 ...

  6. Python实现经典七种排序算法

    #2018-06-02 June Saturday the 22 week, the 153 day SZ #数组排序算法大全用Python3实现 #参考https://www.cnblogs.com ...

  7. Java中常用的6种排序算法详细分解

    排序算法很多地方都会用到,近期又重新看了一遍算法,并自己简单地实现了一遍,特此记录下来,为以后复习留点材料. 废话不多说,下面逐一看看经典的排序算法: 1. 选择排序 选择排序的基本思想是遍历数组的过 ...

  8. 常见七种排序算法对比(超全!!!)

    文章目录 一, 直接插入排序 二,希尔排序 三.选择排序 四,堆排序 五,冒泡排序 六,快速排序 如何优化快排呢? 三数取中法优化快排 七,归并排序 怎么判断是不是稳定的排序呢? 如果当前这个序列,在 ...

  9. 山东大学软件学院大二下数据结构课程设计---排序算法的性能分析

    文章目录 一.题目 二.界面图 主界面 比较和移动次数饼图 比较不同表长的对话框 验证稳定性的对话框 课设录屏 三.题目分析 四.基本思路 五.项目结构 1.开发环境 2.结构介绍 3.关键点及难点 ...

最新文章

  1. dell存储Linux配置,Dell MD3200远程存储的特殊配置
  2. cd命令无法切换路径(Windows下)
  3. 大文件做分割处理的方法——winRAR压缩分割法
  4. 智能终端会议系统(15)---视频会议十大开源编解码项目排行
  5. javascript正则表达式一
  6. 编程笔记:python中下划线的意义
  7. 百度echarts极速入门
  8. MySQL常用命令大全(完整)
  9. 冒死揭开饭圈遮羞布,明星僵尸粉盘点
  10. sql 2000 数据库置疑
  11. Pwn-2018_HITB_CTF-gundam
  12. 存储简单数据——Preferences
  13. 013 两个重要极限之一
  14. 缓存路由关联的两个生命周期activated和deactivated
  15. 如何添加共享计算机用户,局域网共享,教您局域网共享怎么设置
  16. ora**cle数据库过期问题
  17. python数据分析建模-十分钟搞懂“Python数据分析”
  18. 2018年吉林大学软件学院软件工程专硕复试题目回忆
  19. 自动驾驶 9-1: (线性)卡尔曼滤波器The (Linear) Kalman Filter
  20. 手机 Python 编程神器!

热门文章

  1. linux raid卷,linux – Areca RAID卷和LVM对齐
  2. c mysql批量添加数据类型_mybatis学习之路----mysql批量新增数据
  3. mysql正则提取字符串_mysql字符串查找截取与正则表达式的联合应用
  4. mysql增量备份二进制日志,mysql增量备份二进制日志shell脚本
  5. 浙江万里学院计算机专业宿舍,浙江万里学院宿舍条件,宿舍几人间环境好不好(图片)...
  6. keras从入门到放弃(十一)电影评价预测
  7. GPLinker:基于GlobalPointer的事件联合抽取
  8. AAAI 2018论文解读 | 基于置信度的知识图谱表示学习框架
  9. 第二届「机器智能前沿论坛」强势来袭,众多机器学习大咖邀你共话AI未来!
  10. POJ2195 Going Home 最小费用最大流