1.冒泡排序(Bubble Sort)

import java.util.Arrays;
//冒泡排序
public class BubbleSort_01 {public static void main(String[] args) {int a[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};//记录比较次数int count=0;//i=0,第一轮比较for (int i = 0; i < a.length-1; i++) {//第一轮,两两比较for (int j = 0; j < a.length-1-i; j++) {if (a[j]>a[j+1]) {int temp=a[j];a[j]=a[j+1];a[j+1]=temp;}count++;}}System.out.println(Arrays.toString(a));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]System.out.println("一共比较了:"+count+"次");//一共比较了:105次}
}

冒泡排序的优化1:

import java.util.Arrays;
public class BubbleSort1_01 {public static void main(String[] args) {int a[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};int count=0;for (int i = 0; i < a.length-1; i++) {boolean flag=true;for (int j = 0; j < a.length-1-i; j++) {if (a[j]>a[j+1]) {int temp=a[j];a[j]=a[j+1];a[j+1]=temp;flag=false;}count++;}if (flag) {break;}}System.out.println(Arrays.toString(a));// [2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]System.out.println("一共比较了:"+count+"次");//一共比较了:95次}
}

2.选择排序(Select Sort)

import java.util.Arrays;
//选择排序:先定义一个记录最小元素的下标,然后循环一次后面的,找到最小的元素,最后将他放到前面排序好的序列。
public class SelectSort_02 {public static void main(String[] args) {int a[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};for (int i = 0; i < a.length-1; i++) {int index=i;//标记第一个为待比较的数for (int j = i+1; j < a.length; j++) { //然后从后面遍历与第一个数比较if (a[j]<a[index]) {  //如果小,就交换最小值index=j;//保存最小元素的下标}}//找到最小值后,将最小的值放到第一的位置,进行下一遍循环int temp=a[index];a[index]=a[i];a[i]=temp;}System.out.println(Arrays.toString(a));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]}
}

3.插入排序(Insert Sort)

import java.util.Arrays;
//插入排序:定义一个待插入的数,再定义一个待插入数的前一个数的下标,然后拿待插入数与前面的数组一一比较,最后交换。
public class InsertSort_03 {public static void main(String[] args) {int a[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};for (int i = 0; i < a.length; i++) {  //长度不减1,是因为要留多一个位置方便插入数//定义待插入的数int insertValue=a[i];//找到待插入数的前一个数的下标int insertIndex=i-1;while (insertIndex>=0 && insertValue <a[insertIndex]) {//拿a[i]与a[i-1]的前面数组比较a[insertIndex+1]=a[insertIndex];insertIndex--;}a[insertIndex+1]=insertValue;}System.out.println(Arrays.toString(a));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]}
}

4.希尔排序(Shell Sort)

import java.util.Arrays;
//希尔排序:插入排序的升级
public class ShellSort_04 {public static void main(String[] args) {int a[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};int count=0;//比较次数for (int gap=a.length / 2; gap > 0; gap = gap / 2) {//将整个数组分为若干个子数组for (int i = gap; i < a.length; i++) {//遍历各组的元素for (int j = i - gap; j>=0; j=j-gap) {//交换元素if (a[j]>a[j+gap]) {int temp=a[j];a[j]=a[j+gap];a[j+gap]=temp;count++;}}}}System.out.println(count);//16System.out.println(Arrays.toString(a));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]}
}

5.快速排序(Quick Sort)

参考这篇博客

import java.util.Arrays;
//快速排序:冒泡排序的升华版
public class QuickSort_05 {public static void main(String[] args) {//int a[]={50,1,12,2};int a[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};quicksort(a,0,a.length-1);System.out.println(Arrays.toString(a));}private static void quicksort(int[] a, int low, int high) {int i,j;if (low>high) {return;}i=low;j=high;int temp=a[low];//基准位,low=length时,会报异常,java.lang.ArrayIndexOutOfBoundsException: 4 ,所以必须在if判断后面,就跳出方法。while(i<j){//先从右边开始往左递减,找到比temp小的值才停止while ( temp<=a[j] && i<j) {j--;}//再看左边开始往右递增,找到比temp大的值才停止while ( temp>=a[i] && i<j) {i++;}//满足 i<j 就交换,继续循环while(i<j)if (i<j) {int t=a[i];a[i]=a[j];a[j]=t;}}//最后将基准位跟  a[i]与a[j]相等的位置,进行交换,此时i=ja[low]=a[i];a[i]=temp;//左递归quicksort(a, low, j-1);//右递归quicksort(a, j+1, high);    }
}

6.归并排序(Merge Sort)

import java.util.Arrays;
//归并排序
public class MergeSort_06 {public static void main(String[] args) {int a[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};//int a[]={5,2,4,7,1,3,2,2};int temp[]=new int[a.length];mergesort(a,0,a.length-1,temp);System.out.println(Arrays.toString(a));}private static void mergesort(int[] a, int left, int right, int[] temp) {//分解if (left<right) {int mid=(left+right)/2;//向左递归进行分解mergesort(a, left, mid, temp);//向右递归进行分解mergesort(a, mid+1, right, temp);//每分解一次便合并一次merge(a,left,right,mid,temp);}}/**** @param a  待排序的数组* @param left  左边有序序列的初始索引* @param right 右边有序序列的初始索引* @param mid    中间索引* @param temp  做中转的数组*/private static void merge(int[] a, int left, int right, int mid, int[] temp) {int i=left; //初始i,左边有序序列的初始索引int j=mid+1;//初始化j,右边有序序列的初始索引(右边有序序列的初始位置即中间位置的后一位置)int t=0;//指向temp数组的当前索引,初始为0//先把左右两边的数据(已经有序)按规则填充到temp数组//直到左右两边的有序序列,有一边处理完成为止while (i<=mid && j<=right) {//如果左边有序序列的当前元素小于或等于右边的有序序列的当前元素,就将左边的元素填充到temp数组中if (a[i]<=a[j]) {temp[t]=a[i];t++;//索引向后移i++;//i后移}else {//反之,将右边有序序列的当前元素填充到temp数组中temp[t]=a[j];t++;//索引向后移j++;//j后移}}//把剩余数据的一边的元素填充到temp中while (i<=mid) {//此时说明左边序列还有剩余元素//全部填充到temp数组temp[t]=a[i];t++;i++;}while (j<=right) {//此时说明左边序列还有剩余元素//全部填充到temp数组temp[t]=a[j];t++;j++;}//将temp数组的元素复制到原数组t=0;int tempLeft=left;while (tempLeft<=right) {a[tempLeft]=temp[t];t++;tempLeft++;}}}

7.堆排序(Heap Sort)

堆排序
第一步:构建初始堆buildHeap, 使用sink(arr,i, length)调整堆顶的值;
第二步:将堆顶元素下沉 目的是将最大的元素浮到堆顶来,然后使用sink(arr, 0,length)调整;
堆排序图解:链接

public class Heap_Sort_07 {public static void main(String[] args) {int a[]={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};  sort(a);System.out.println(Arrays.toString(a));}public static void sort(int[] arr) {int length = arr.length;//构建堆buildHeap(arr,length);for ( int i = length - 1; i > 0; i-- ) {//将堆顶元素与末位元素调换int temp = arr[0];arr[0] = arr[i];arr[i] = temp;//数组长度-1 隐藏堆尾元素length--;//将堆顶元素下沉 目的是将最大的元素浮到堆顶来sink(arr, 0,length);}}private static void buildHeap(int[] arr, int length) {for (int i = length / 2; i >= 0; i--) {sink(arr,i, length);}}private static void sink(int[] arr, int index, int length) {int leftChild = 2 * index + 1;//左子节点下标int rightChild = 2 * index + 2;//右子节点下标int present = index;//要调整的节点下标//下沉左边if (leftChild < length && arr[leftChild] > arr[present]) {present = leftChild;}//下沉右边if (rightChild < length && arr[rightChild] > arr[present]) {present = rightChild;}//如果下标不相等 证明调换过了if (present != index) {//交换值int temp = arr[index];arr[index] = arr[present];arr[present] = temp;//继续下沉sink(arr, present, length);}}
}

8.计数排序 (Count Sort)

参考链接
算法的步骤如下:

  • 找出待排序的数组array中最大的元素max
  • 统计数组中每个值为 i 的元素出现的次数,存入数组 count 的第 i 项
  • 对所有的计数累加(从 count中的第一个元素开始,每一项和前一项相加)
  • 反向填充目标数组:将每个元素 i 放在新数组的第 count [i] 项,每放一个元素就将 count [i] 减去

import java.util.Arrays;
public class CountSort_08 {public static void main(String[] args) {int[] array = { 4, 2, 2, 8, 3, 3, 1 };// 找到数组中最大的值 ---> max:8int max = findMaxElement(array);int[] sortedArr = countingSort(array, max + 1);System.out.println("计数排序后的数组: " + Arrays.toString(sortedArr));}private static int findMaxElement(int[] array) {int max = array[0];for (int val : array) {if (val > max)max = val;}return max;}private static int[] countingSort(int[] array, int range) { //range:8+1int[] output = new int[array.length]; int[] count = new int[range];//初始化: count1数组for (int i = 0; i < array.length; i++) {count[array[i]]++;}//计数: count2数组,累加次数后的,这里用count2区分for (int i = 1; i < range; i++) {count[i] = count[i] + count[i - 1];}//排序:最后数组for (int i = 0; i < array.length; i++) {output[count[array[i]] - 1] = array[i];count[array[i]]--;}return output;}
}

9.桶排序(Bucket Sort)

参考链接

桶排序可以看成是计数排序的升级版,它将要排的数据分到多个有序的桶里,每个桶里的数据再单独排序,再把每个桶的数据依次取出,即可完成排序。
桶排序:将值为i的元素放入i号桶,最后依次把桶里的元素倒出来。
桶排序序思路:

  • 设置一个定量的数组当作空桶子。
  • 寻访序列,并且把项目一个一个放到对应的桶子去。
  • 对每个不是空的桶子进行排序。
  • 从不是空的桶子里把项目再放回原来的序列中。
public class BucketSort_09 {public static void sort(int[] arr){//最大最小值int max = arr[0];int min = arr[0];int length = arr.length;for(int i=1; i<length; i++) {if(arr[i] > max) {max = arr[i];} else if(arr[i] < min) {min = arr[i];}}//最大值和最小值的差int diff = max - min;//桶列表ArrayList<ArrayList<Integer>> bucketList = new ArrayList<>();for(int i = 0; i < length; i++){bucketList.add(new ArrayList<>());}//每个桶的存数区间float section = (float) diff / (float) (length - 1);//数据入桶for(int i = 0; i < length; i++){//当前数除以区间得出存放桶的位置 减1后得出桶的下标int num = (int) (arr[i] / section) - 1;if(num < 0){num = 0;}bucketList.get(num).add(arr[i]);}//桶内排序for(int i = 0; i < bucketList.size(); i++){//jdk的排序速度当然信得过Collections.sort(bucketList.get(i));}//写入原数组int index = 0;for(ArrayList<Integer> arrayList : bucketList){for(int value : arrayList){arr[index] = value;index++;}}}
}

10.基数排序(Raix Sort)

我们假设有一个待排序数组[53,3,542,748,14,214],那么如何使用基数排序对其进行排序呢?
首先我们有这样的十个一维数组,在基数排序中也叫桶。用桶排序实现。
第一轮,以元素的个位数进行区分:[542,53,3,14,214,748]
第二轮,以元素的十位数进行区分:[3,14,214,542,748,53]第三轮,以元素的百位数进行区分:[3,14,53,214,542,748]

import java.util.Arrays;
public class RaixSort_10 {public static void main(String[] args) {int[] arr = { 53, 3, 542, 748, 14, 214 };// 得到数组中最大的数int max = arr[0];// 假设第一个数就是数组中的最大数for (int i = 1; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}}// 得到最大数是几位数// 通过拼接一个空串将其变为字符串进而求得字符串的长度,即为位数int maxLength = (max + "").length();// 定义一个二维数组,模拟桶,每个桶就是一个一维数组// 为了防止放入数据的时候桶溢出,我们应该尽量将桶的容量设置得大一些int[][] bucket = new int[10][arr.length];// 记录每个桶中实际存放的元素个数// 定义一个一维数组来记录每个桶中每次放入的元素个数int[] bucketElementCounts = new int[10];// 通过变量n帮助取出元素位数上的数for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {for (int j = 0; j < arr.length; j++) {// 针对每个元素的位数进行处理int digitOfElement = arr[j] / n % 10;// 将元素放入对应的桶中// bucketElementCounts[digitOfElement]就是桶中的元素个数,初始为0,放在第一位bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];// 将桶中的元素个数++// 这样接下来的元素就可以排在前面的元素后面bucketElementCounts[digitOfElement]++;}// 按照桶的顺序取出数据并放回原数组int index = 0;for (int k = 0; k < bucket.length; k++) {// 如果桶中有数据,才取出放回原数组if (bucketElementCounts[k] != 0) {// 说明桶中有数据,对该桶进行遍历for (int l = 0; l < bucketElementCounts[k]; l++) {// 取出元素放回原数组arr[index++] = bucket[k][l];}}// 每轮处理后,需要将每个bucketElementCounts[k]置0bucketElementCounts[k] = 0;}}System.out.println(Arrays.toString(arr));//[3, 14, 53, 214, 542, 748]}
}

基数排序是用空间换时间的经典算法,当数据足够多时,达到几千万级别时内存空间可能不够用了,发生堆内存溢出

————————————————
版权声明:本文为CSDN博主「~wangweijun」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42453117/article/details/100036347

java实现10种排序算法相关推荐

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

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

  2. 10种排序算法基础总结

    基于比较的排序: 基础排序:  冒泡排序:谁大谁上,每一轮都把最大的顶到天花板 效率太低--掌握swap. 选择排序:效率较低,但经常用它内部的循环方式来找最大值和最小值. 插入排序:虽然平均效率低, ...

  3. 10种排序算法比较(直接插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序、折半插入排序、2路插入排序)

    本文(所有排序算法代码+综合比较代码)链接:https://download.csdn.net/download/qq_39932172/11217572 一.比较目的: 由于<数据结构> ...

  4. 17种编程语言+10种排序算法

    开源地址 https://gitee.com/lblbc/simple-works/tree/master/sort 覆盖语言:C.C++.C#.Java.Kotlin.Dart.Go.JavaScr ...

  5. 常见的10种排序算法

    前言 排序算法是在生活中随处可见,也是算法基础 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比 ...

  6. java实现八种排序算法并测试速度(详细)

    算法代码: /*** Created by CLY on 2017/3/17.*/ package pers.cly.sorting; /*** 排序工具类,里面包含各种排序方法*/ public c ...

  7. 快速排序java代码_8 种排序算法与 Java 代码实现!

    1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列中. 将第一个数和第二个数排序,然后构成一个有序序列 将第三个数插入进去,构成一个新的有序序列. 对第四个数.第五个数--直 ...

  8. 10种 排序算法 稳定性,复杂度的分析

    排序相关概念 排序项:排序依据的数据 关键码:主关键码,次关键码,主关键码对于任意排序的序列结果唯一,关键码是次关键码排序结果不一定唯一,由于才可能存在相同的关键值记录. 内部排序:排序过程中全放入内 ...

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

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

  10. Java常见的几种排序算法-插入、选择、冒泡、快排、堆排等

    本文就是介绍一些常见的排序算法.排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排 ...

最新文章

  1. .net平台性能很不错的轻型ORM类Dapper(转)
  2. shiro框架采取MD5+salt方式加密密码
  3. php mysql source_详解MySQL数据库中有关source命令
  4. C语言实现面向对象的思想
  5. css text-align-last设置末尾文本对齐方式
  6. MagicRecord For IOS 简介
  7. Ubuntu 20.10 Beta 版本发布
  8. 差分进化算法python_差分进化算法DE-python实现
  9. 以软件开发周期来说明不同的测试的使用情况
  10. R绘图 第九篇:绘制散点图和气泡图(ggplot2)
  11. LaTeX 注释一行的某一部分
  12. 微型计算机配置单怎么写,微型计算机的组成和配置.doc
  13. ns3学习之初识ns3
  14. Multi-Loss Weighting with Coefficient of Variations 多任务学习
  15. MATLAB中怎么表示对数函数及e
  16. 使用iMovie和Keynote制作App Preview
  17. list的add方法 ,foreach循环添加map---List.add(map)(通过一个java爬虫案例说明)
  18. java-day24
  19. java异常排列方式_java中排序报:Comparison method violates its general contract异常的解决...
  20. Wiremock的使用

热门文章

  1. linux fread函数的用法,fread和fwrite用法详解
  2. linux运维实战案例,Linux运维实战练习案例20151220~20151231
  3. KVYcam(网络摄像头软件) v13.0.3.0
  4. 200多个引流推广渠道及技巧,全网引流布局
  5. Vue购物商城项目(一)
  6. Jquery 取色器
  7. java利用xml生成excel_代码快速 实现xml 转换为 Excel(xml转excel通用类-java-完成代码可作工具使用).doc...
  8. python notebook_Python Notebook (Jupyter Notebook) 介绍
  9. 举个栗子!Tableau 技巧(97):离线安装 Linux 版 Tableau Server
  10. Excel写批量代码(一)