冒泡排序

基本思想:

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

Java实现

加入标记状态 flag 若在一次冒泡中,没有交换 则说明可以停止 减少运行时

public static void bubbleSort(int[] numbers) {

int temp = 0;

int size = numbers.length;

boolean flag = true;

for (int i = 0; i < size - 1&&flag; i++) {

flag = false;

for (int j = 0; j < size - 1 - i; j++) {

if (numbers[j] > numbers[j + 1]) // 交换两数位置

{

temp = numbers[j];

numbers[j] = numbers[j + 1];

numbers[j + 1] = temp;

flag = true;

}

}

}

}

时间复杂度O(n*n)

选择排序算法

基本思想:

在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。

Java 实现

public static void selectSort(int[] numbers) {

int size = numbers.length; // 数组长度

int temp = 0; // 中间变量

for (int i = 0; i < size-1; i++) {

int k = i; // 待确定的位置

// 选择出应该在第i个位置的数

for (int j = size - 1; j > i; j--) {

if (numbers[j] < numbers[k]) {

k = j;

}

}

// 交换两个数

temp = numbers[i];

numbers[i] = numbers[k];

numbers[k] = temp;

}

}

时间复杂度O(n*n) 性能上优于冒泡排序 交换次数少

插入排序算法

基本思想:

每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置(从后向前找到合适位置后),直到全部插入排序完为止。

java 实现

public static void insertSort(int[] numbers) {

int size = numbers.length;

int temp = 0;

int j = 0;

for (int i = 1; i < size; i++) {

temp = numbers[i];

// 假如temp比前面的值小,则将前面的值后移

for (j = i; j > 0 && temp < numbers[j - 1]; j--) {

numbers[j] = numbers[j - 1];

}

numbers[j] = temp;

}

}

时间复杂度

O(n*n) 性能上优于冒泡排序和选择排序

希尔排序算法

基本思想:

先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。

java 实现

/**

* 希尔排序的原理:根据需求,如果你想要结果从小到大排列,它会首先将数组进行分组,然后将较小值移到前面,较大值

* 移到后面,最后将整个数组进行插入排序,这样比起一开始就用插入排序减少了数据交换和移动的次数,

* 可以说希尔排序是加强 版的插入排序 拿数组5, 2,8, 9, 1, 3,4来说,数组长度为7,当increment为3时,数组分为两个序列

* 5,2,8和9,1,3,4,第一次排序,9和5比较,1和2比较,3和8比较,4和比其下标值小increment的数组值相比较

* 此例子是按照从小到大排列,所以小的会排在前面,第一次排序后数组为5, 1, 3, 4, 2, 8,9

* 第一次后increment的值变为3/2=1,此时对数组进行插入排序, 实现数组从大到小排

*/

public static void shellSort(int[] data) {

int j = 0;

int temp = 0;

// 每次将步长缩短为原来的一半

for (int increment = data.length / 2; increment > 0; increment /= 2) {

for (int i = increment; i < data.length; i++) {

temp = data[i];

for (j = i; j >= increment; j -= increment) {

if (temp < data[j - increment])// 从小到大排

{

data[j] = data[j - increment];

} else {

break;

}

}

data[j] = temp;

}

}

}

时间复杂度O(n^1.5)

堆排序算法

基本思想:

堆排序是一种树形选择排序,是对直接选择排序的有效改进。

堆的定义下:具有n个元素的序列 (h1,h2,...,hn),当且仅当满足(hi>=h2i,hi>=h2i+1)或(hi<=h2i,hi<=h2i+1) (i=1,2,...,n/2)时称之为堆。在这里只讨论满足前者条件的堆。由堆的定义可以看出,堆顶元素(即第一个元素)必为最大项(大顶堆)。完全二叉树可以很直观地表示堆的结构。堆顶为根,其它为左子树、右子树。

思想:初始时把要排序的数的序列看作是一棵顺序存储的二叉树,调整它们的存储序,使之成为一个 堆,这时堆的根节点的数最大。然后将根节点与堆的最后一个节点交换。然后对前面(n-1)个数重新调整使之成为堆。依此类推,直到只有两个节点的堆,并对 它们作交换,最后得到有n个节点的有序序列。从算法描述来看,堆排序需要两个过程,一是建立堆,二是堆顶与堆的最后一个元素交换位置。所以堆排序有两个函数组成。一是建堆的渗透函数,二是反复调用渗透函数实现排序的函数。

java 实现

public static void heapSort(int[] a){

int arrayLength = a.length;

// 循环建堆

for (int i = 0; i < arrayLength - 1; i++) {

// 建堆

buildMaxHeap(a, arrayLength - 1 - i);

// 交换堆顶和最后一个元素

swap(a, 0, arrayLength - 1 - i);

System.out.println(Arrays.toString(a));

}

}

// 对data数组从0到lastIndex建大顶堆

public static void buildMaxHeap(int[] data, int lastIndex) {

// 从lastIndex处节点(最后一个节点)的父节点开始

for (int i = (lastIndex - 1) / 2; i >= 0; i--) {

// k保存正在判断的节点

int k = i;

// 如果当前k节点的子节点存在

while (k * 2 + 1 <= lastIndex) {

// k节点的左子节点的索引

int biggerIndex = 2 * k + 1;

// 如果biggerIndex小于lastIndex,即biggerIndex+1代表的k节点的右子节点存在

if (biggerIndex < lastIndex) {

// 若果右子节点的值较大

if (data[biggerIndex] < data[biggerIndex + 1]) {

// biggerIndex总是记录较大子节点的索引

biggerIndex++;

}

}

// 如果k节点的值小于其较大的子节点的值

if (data[k] < data[biggerIndex]) {

// 交换他们

swap(data, k, biggerIndex);

// 将biggerIndex赋予k,开始while循环的下一次循环,重新保证k节点的值大于其左右子节点的值

k = biggerIndex;

} else {

break;

}

}

}

}

// 交换

private static void swap(int[] data, int i, int j) {

int tmp = data[i];

data[i] = data[j];

data[j] = tmp;

}

时间复杂度O(nlogn)不适合待排序序列较少的情况

快速排序算法

基本思想:

通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对这两部分继续进行排序,直到整个序列有序。

java 实现

/**

* 快速排序

*

* @param numbers

* 带排序数组

*/

public static void quick(int[] numbers) {

if (numbers.length > 0) // 查看数组是否为空

{

quickSort(numbers, 0, numbers.length - 1);

}

}

/**

*

* @param numbers

* 带排序数组

* @param low

* 开始位置

* @param high

* 结束位置

*/

public static void quickSort(int[] numbers, int low, int high) {

if (low >= high) {

return;

}

int middle = getMiddle(numbers, low, high); // 将numbers数组进行一分为二

quickSort(numbers, low, middle - 1); // 对低字段表进行递归排序

quickSort(numbers, middle + 1, high); // 对高字段表进行递归排序

}

/**

* 查找出中轴(默认是最低位low)的在numbers数组排序后所在位置

*

* @param numbers

* 带查找数组

* @param low

* 开始位置

* @param high

* 结束位置

* @return 中轴所在位置

*/

public static int getMiddle(int[] numbers, int low, int high) {

int temp = numbers[low]; // 数组的第一个作为中轴

while (low < high) {

while (low < high && numbers[high] > temp) {

high--;

}

numbers[low] = numbers[high];// 比中轴小的记录移到低端

while (low < high && numbers[low] < temp) {

low++;

}

numbers[high] = numbers[low]; // 比中轴大的记录移到高端

}

numbers[low] = temp; // 中轴记录到尾

return low; // 返回中轴的位置

}

时间复杂度O(nlogn)

快速排序在序列中元素很少时,效率将比较低,不如插入排序,因此一般在序列中元素很少时使用插入排序,这样可以提高整体效率。

归并排序算法

基本思想:

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

java 实现

/**

* 归并排序

* 简介:将两个(或两个以上)有序表合并成一个新的有序表 即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列

* 时间复杂度为O(nlogn)

* 稳定排序方式

* @param nums 待排序数组

* @return 输出有序数组

*/

public static int[] sort(int[] nums, int low, int high) {

int mid = (low + high) / 2;

if (low < high) {

// 左边

sort(nums, low, mid);

// 右边

sort(nums, mid + 1, high);

// 左右归并

merge(nums, low, mid, high);

}

return nums;

}

/**

* 将数组中low到high位置的数进行排序

* @param nums 待排序数组

* @param low 待排的开始位置

* @param mid 待排中间位置

* @param high 待排结束位置

*/

public static void merge(int[] nums, int low, int mid, int high) {

int[] temp = new int[high - low + 1];

int i = low;// 左指针

int j = mid + 1;// 右指针

int k = 0;

// 把较小的数先移到新数组中

while (i <= mid && j <= high) {

if (nums[i] < nums[j]) {

temp[k++] = nums[i++];

} else {

temp[k++] = nums[j++];

}

}

// 把左边剩余的数移入数组

while (i <= mid) {

temp[k++] = nums[i++];

}

// 把右边边剩余的数移入数组

while (j <= high) {

temp[k++] = nums[j++];

}

// 把新数组中的数覆盖nums数组

for (int k2 = 0; k2 < temp.length; k2++) {

nums[k2 + low] = temp[k2];

}

}

时间复杂度O(nlogn)

各种算法的时间复杂度等性能比较

java通过比较大小排序_排序算法的比较与java实现相关推荐

  1. java零钱换整程序_贪心算法换零钱(java)

    贪心算法思想 贪心算法总是做出在当前看来做好的选择.也就是说贪心算法并不从整体最后考虑,他做出的选择只是局部最优选择.他所做出的仅是在某种意义上的局部最优解.贪心算法不是对所有问题都能得到整体最优解, ...

  2. java sorted排序_【算法】排序算法之计数排序

    前几回,我们已经对冒泡排序.直接插入排序.希尔排序.选择排序.快速排序.归并排序.堆排序做了说明分析.本回,将对计数排序进行相关说明分析. 一.排序算法系列目录说明 冒泡排序(Bubble Sort) ...

  3. Java冒泡,快速,插入,选择排序^_^+二分算法查找

    这段时间在学Java,期间学到了一些排序和查找方法.特此写来和大家交流,也方便自己的日后查看与复习. 1.下边是Java的主类: public class Get {public static voi ...

  4. 倒序排序_排序算法(六):Counting Sort 计数排序

    之前文章介绍的一些排序算法都是基于比较来进行排序的,故它们在平均情况下的时间复杂度最好也不过是线性对数级别.这里我们来介绍一种简单的基于非比较的排序算法--Counting Sort 计数排序,其时间 ...

  5. c++ 二维数组 排序_【算法】排序算法之计数排序

    前几回,我们已经对[算法]排序算法之冒泡排序.[算法]排序算法之插入排序.[算法]排序算法之希尔排序.[算法]排序算法之选择排序.[算法]排序算法之快速排序.[算法]排序算法之归并排序.[算法]排序算 ...

  6. java雪花数据库长度_雪花算法(SnowFlake)Java实现

    算法原理 SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图: 由于在Java中64bit的整数是long类型,所以在Java中SnowFlake算法生成的id就是long ...

  7. java 堆排序算法_堆排序算法的讲解及Java版实现

    这篇文章主要介绍了堆排序算法的讲解及Java版实现,堆排序基于堆这种数据结构,在本文中对堆的概念也有补充介绍,需要的朋友可以参考下 堆是数据结构中的一种重要结构,了解了"堆"的概念 ...

  8. long 雪花算法_雪花算法(SnowFlake)Java版

    算法原理 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0 41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截, ...

  9. java条码查商品信息_条形码商品管理信息系统SQL JAVA源码大小11M

    条形码商品管理信息系统SQL JAVA源码大小11M 源码下载地址: (精品源码有详细软件界面截图) 本站提供几百套大型商业源码,平均一元一套,火爆下载中...... QQ:283072.283672 ...

最新文章

  1. 【组队学习】【26期】图神经网络
  2. Quartz-任务调度信息持久化到DB中
  3. react native 从头开始
  4. 点点文刊 -- 记录生活的色彩
  5. MyBatis学习总结(21)——自定义MyBatis Generator插件
  6. jmeter配置文件--随机变量
  7. 【Oracle】详解10053事件
  8. python教程视频哪个好-Python视频教程谁的好
  9. idea tomcat 发布web工程全过程
  10. 唐宇迪学习笔记19:聚类算法——Kmeans
  11. html静态页面作业 我的家乡网站设计——我的家乡-杭州(7页) HTML+CSS+JavaScript 大学生家乡网页作品 老家网页设计作业模板 学生网页制作源代码下载
  12. 数字版权管理 (DRM) 续
  13. 0441-Impala动态资源池及放置规则使用
  14. 阿里云企业邮箱标准版/集团版/尊享版区别对比
  15. 最新课表 | 谱尼学院十一月培训课程重磅来袭!
  16. FlashPaper的安装以及基本使用
  17. 阿里开发手册 学习 记忆 理解 表达 融会贯通
  18. Postman之CSV或JOSN文件实现数据驱动(参数化)
  19. Win10多用户同时远程桌面的另类解决方案---支持1809和1909和2004版本V2.0
  20. elasticsearch es sum求和统计用法

热门文章

  1. 使用remoteApp发布金蝶K3
  2. 链表和数组的优缺点对比
  3. ceph学习笔记和基础知识
  4. 仓储智能调度算法——质量保障方案
  5. Android 组件化架构概要,熬夜整理Android高频面试题
  6. 实习项目(APP线上活动页面)
  7. EditText 实时显示输入的字数与最大输入限制长度
  8. php pcntl sigterm,php – 如果pcntl_signal()被设置,我可以依靠在SIGTERM上调用register_shutdown_function()吗?...
  9. 利用keras破解captcha验证码
  10. 智慧公厕改造方案!中期科技ZONTREE美丽县城智慧厕所的设计案例