一些常见的排序算法的事项以及java实现
由于时间上的原因没有计算时间复杂度,以后有时间补上,或者大家有兴趣的可以自己算算

package com.sgcc.cn;import java.util.Arrays;/*** 插入排序:直接插入排序、二分法插入排序、希尔排序。* * 选择排序:简单选择排序、堆排序。* * 交换排序:冒泡排序、快速排序。* * 归并排序* * 基数排序* * */// 此处排序都是从小到大
public class SortAlgorithm {/*** 插入排序算法:直接插入排序(从前向后找合适位置插入)* @param array 一个int型的数组* @return int类型的排序后的数组* */public static int[] straightInsertionSort(int[] array) {int temp;//带插入的元素int i,j;//循环变量for (i = 1; i < array.length; i++) {temp = array[i];// 待插入的元素for (j = i-1; j >= 0 && temp < array[j]; j--) {//从后面到前面比较,第一个元素为当前元素前一个,如果比temp大就向后移动一位array[j+1] = array[j];}array[j+1] = temp;//由于j--因此j+1才是要插入的第j个元素//           for(j = i-1; j >= 0; j--){//              if(temp <= array[j]){//                  array[j+1] = array[j];
//              }else{//                  break;
//              }
//          }
//          array[j+1] = temp;}return array;}/*** 插入排序算法:二分排序算法(按二分法找到合适位置插入)* @param array 一个int型的数组* @return int类型的排序后的数组* */public static int[] binaryInsertionSort(int[] array){int i,j;//循环变量int low,mid,heigh;//插入位置变量int temp;//将要插入的元素for(i = 1; i < array.length; i++){temp = array[i];//将要插入的数字low = 0;heigh = i-1;while(low <= heigh){mid = (low+heigh)/2;if(temp<array[mid]){heigh = mid-1;                   }else {low = mid+1;}}for(j = i-1; j >=low; j--){array[j+1] = array[j];}if(low != i){//如果是自己就不用替换array[low] = temp;           }}return array;}/*** 插入排序算法:希尔排序(基本思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。该方法实质上是一种分组插入方法。)* @param array 一个int型的数组* @return int类型的排序后的数组* */public static int[] shellSort(int[] array){int i,j,k;//循环变量int temp;//待插入元素int dt = array.length/2;//初始化变量while(dt != 1){System.out.println("现在dt="+dt);dt = dt/2;for(i = 0; i < dt; i++){//对进行的分组进行循环访问for(j = i+dt; j < array.length; j = j+dt){//对组内数据进行插入排序temp = array[j];for(k = j-dt; k >= 0; k = k-dt){if(temp < array[k]){array[k+dt] = array[k];}else{break;}}array[k+dt] = temp;//在对第k个位置赋值}}}return array;}/*** 选择排序:简单选择排序(每趟从待排序的记录序列中选择关键字最大的记录放置到已排序表的最前位置,直到全部排完)* @param array 一个int型的数组* @return int类型的排序后的数组* */public static int[] simpleSelectionSort(int[] array) {int i, j, k;// 循环的变量int temp;// 待替换的元素for (i = 0; i < array.length; i++) {temp = array[i];k = i;for (j = i + 1; j < array.length; j++) {if (temp > array[j]) {temp = array[j];k = j;}}array[k] = array[i];array[i] = temp;}return array;}/*** 选择排序:堆排序(1.构建最大堆。2.选择顶,并与第0位置元素交换。3.由于步骤2的的交换可能破环了最大堆的性质,第0不再是最大元素,需要调用maxHeap调整堆(沉降法),如果需要重复步骤2)* @param array 一个int型数组* @return int类型的排序后的数组* */public static int[] heapSort(int[] array) {for (int i = 0; i < array.length; i++) {createMaxdHeap(array, array.length - 1 - i);swap(array, 0, array.length - 1 - i);}return array;}public static void swap(int[] array, int i, int j) {  if (i == j) {return;}array[i] = array[i] + array[j];array[j] = array[i] - array[j];array[i] = array[i] - array[j];}public static void createMaxdHeap(int[] array, 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应该等于 lastIndexif (array[biggerIndex] < array[biggerIndex + 1]) {// 若右子节点值比左子节点值大,则biggerIndex记录的是右子节点的值biggerIndex++;}}if (array[k] < array[biggerIndex]) {// 若当前节点值比子节点最大值小,则交换2者得值,交换后将biggerIndex值赋值给kswap(array, k, biggerIndex);k = biggerIndex;} else {break;}}}}/*** 交换排序:冒泡排序(在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。)* @param array 一个int型的数组* @return int类型的排序后的数组* */public static int[] bubbingSort(int[] array){int i,j;//循环变量int temp;//中间元素for(i = 0; i < array.length; i++){//控制数字个数for(j = 0; j < array.length-i-1; j++){//控制比较次数if(array[j] > array[j+1]){temp = array[j];array[j] = array[j+1];array[j+1] = temp;}}}return array;}/*** 交换排序:快速排序(通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。)* @param array 一个int型的数组* @return int类型的排序后的数组* */public static int[] quicksort(int array[], int left, int right) {int mid;if (left < right) {mid = partition(array, left, right);quicksort(array, left, mid - 1);quicksort(array, mid + 1, right);}return array;}//寻找数组中间的位置public static int partition(int array[], int left, int right) {int pivot = array[left];while (left < right) {while (left < right && array[right] >= pivot)right--;if (left < right)array[left++] = array[right];while (left < right && array[left] <= pivot)left++;if (left < right)array[right--] = array[left];}array[left] = pivot;return left;}/*** 归并排序* @param array 一个int型数组(归并排序也是一个递归的实现,其关键在于合并两个有序集。数组array从min到mid有序,从mid+1到max有序,合并这两部分,使得从min到max有序,且这个有序序列仍然放在array的从min到max下标里。)* @return int类型的排序后的数组* */public static int[] mergeSort(int[] array, int left, int right) {if (left >= right)return array;int center = (left + right) / 2;// 找出中间索引mergeSort(array, left, center);// 对左边数组进行递归mergeSort(array, center + 1, right);// 对右边数组进行递归merge(array, left, center, right);//合并,其关键在于合并两个有序集return array;}  public static void merge(int[] array, int left, int center, int right) {int[] tmpArr = new int[array.length];// 临时数组int mid = center + 1;                // 右数组第一个元素索引int third = left;                    // third 记录临时数组的索引int tmp = left;                      // 缓存左数组第一个元素的索引while (left <= center && mid <= right) {// 从两个数组中取出最小的放入临时数组if (array[left] <= array[mid]) {tmpArr[third++] = array[left++];} else {tmpArr[third++] = array[mid++];}}while (mid <= right) {// 剩余部分依次放入临时数组(实际上两个while只会执行其中一个)tmpArr[third++] = array[mid++];}while (left <= center) {tmpArr[third++] = array[left++];}while (tmp <= right) {// 将临时数组中的内容拷贝回原数组中(原left-right范围的内容被复制回原数组)array[tmp] = tmpArr[tmp++];}  }/*** 基数排序(基数排序法又称"桶子法",顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些"桶"中,藉以达到排序的作用)* @param array 一个int型数组* @return int类型的排序后的数组* */public static int[] radixSort(int[] array, int radix, int d) {// 缓存数组int[] tmp = new int[array.length];int[] buckets = new int[radix];//buckets用于记录待排序元素的信息, buckets数组定义了max-min个桶  for (int i = 0, rate = 1; i < d; i++) {  Arrays.fill(buckets, 0);// 重置count数组,开始统计下一个关键字System.arraycopy(array, 0, tmp, 0, array.length);// 将array中的元素完全复制到tmp数组中for (int j = 0; j < array.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 = array.length - 1; m >= 0; m--) {// 按子关键字对指定的数据进行排序int subKey = (tmp[m] / rate) % radix;array[--buckets[subKey]] = tmp[m];}rate *= radix;}return array;}/*** 打印数组* @param array int类型数组* */public static void printArray(int[] array) {  for (int i = 0; i < array.length; i++) {  System.out.print(array[i] + "\t");  }  System.out.println();  }//测试main方法public static void main(String[] agrs) {int[] array = { 2, 7, 8, 21, 23, 23, 1, 65, 12, 33, 112 };System.out.println("排序前的数组:");printArray(array);System.out.println();array = mergeSort(array, 0, array.length - 1);System.out.println("排序后的数组:");printArray(array);}}

只总结了一些常用算法的实现,分享一下,希望共同学习,共同进步。

关于demo的github地址如下

https://github.com/leo825/sortalgorithm.git

java常用的排序算法的思想以及实现相关推荐

  1. java语言冒泡排序法_Java实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等...

    本文实现了八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 .快速排序.归并排序.堆排序和LST基数排序 首先是EightAlgorithms.java文件,代码如下: import jav ...

  2. 【Java】八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序 、快速排序、归并排序、堆排序和LST基数排序

    这篇文章主要介绍了Java如何实现八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 .快速排序.归并排序.堆排序和LST基数排序,需要的朋友可以参考下 本文实现了八个常用的排序算法:插入排序 ...

  3. java 奇偶数据排序算法,简单讲解奇偶排序算法及在Java数组中的实现

    简单讲解奇偶排序算法及在Java数组中的实现 奇偶排序是一个比较有个性的排序,基本思路是奇数列排一趟序,偶数列排一趟序,再奇数排,再偶数排,直到全部有序 举例吧, 待排数组 [6 2 4 1 5 9] ...

  4. 常用的排序算法的时间复杂度和空间复杂度

    常用的排序算法的时间复杂度和空间复杂度                                           1.时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出 ...

  5. android studio插入数据表中没有_学Java能拿高薪吗 Java中常见排序算法有哪些

    学Java能拿高薪吗?Java中常见排序算法有哪些?作为老牌编程语言,Java拥有广阔的市场占有率,几乎90%以上的大中型互联网应用系统在服务端开发都会首选Java.为了加入到Java这一高薪行业,很 ...

  6. Java回炉之排序算法

    Java回炉之排序算法 Java回炉之排序算法 冒泡排序 插入排序 归并排序 快速排序 希尔排序 选择排序 堆排序 冒泡排序 一次次遍历数组,每次比较相邻两个. 两重循环,内层比较index和inde ...

  7. Java默认的排序算法

    Java基础-08 [08:11] Java默认的排序算法: 需要区分: 是 Arrays.sort() 还是 Collections.sort() (底层是调用 Arrays.sort()): 什么 ...

  8. 排序算法java源代码_排序算法汇总(java实现,附源代码)

    整理系统的时候发现了原来写的各种算法的总结,看了一下,大吃一惊,那时候的我还如此用心,具体的算法,有的已经模糊甚至忘记了,看的时候就把内容整理出来,顺便在熟悉一下,以后需要的时候就可以直接过来摘抄了. ...

  9. STL常用的排序算法

    常用的排序算法 merge() sort() random_shuffle() reverse() merge() 以下是排序和通用算法:提供元素排序策略 merge: 合并两个有序序列,存放到另一个 ...

最新文章

  1. 软件专业人才应具备四种素质
  2. STM32F10x随笔(gcc+scons)
  3. 【7-4使用inception-v3做各种图像的识别】
  4. servlet ---- EL表达式
  5. java 并发原子性与易变性 来自thinking in java4 21.3.3
  6. elasticsearch6.0、jdk1.8、IK、kibana集群配置
  7. 网盘和云备份 区别在哪里
  8. django.forms生成HTML,python – 在django中为表单自动生成表单字段
  9. java如何求上个月的最后一天是多少号_JAVA入门题
  10. 【竞赛总结】安全AI之人脸识别对抗
  11. dss中文含义_DSS(中文译名:决策支持系统),这是什么系统?有多少个种类?...
  12. mysql根据用户经纬度查询附近商家,mysql根据经纬度获取附近的商家
  13. maven工程报错:One or more constraints have not been satisfied
  14. 中国平安银行关于软件测试笔试试题(二)
  15. 被低估的EIP-3074,以太坊用户的大利好
  16. 云原生时代,Kubernetes 让应用落地的 N 种招式(附 PPT)
  17. yolov4与yolov5的区别
  18. 开关电源输出纹波主要来源五个方面?示波器测纹波方法?
  19. 2380318-57-8,Thalidomide-O-PEG4-Azide通过点击化学与炔烃或DBCO、BCN连接的分子反应的PROTAC连接物
  20. 一个月瘦10斤的计划

热门文章

  1. 迪桑特案例拆解:社群运营如何在高端运动服装品牌中发挥价值?
  2. 遍历文件夹_使用JavaScript遍历本地文件夹的文件
  3. 怎么把cad做的图分享给别人_干货在线 | 这20个CAD技巧值得收藏!
  4. BUUCTF(pwn)not_the_same_3dsctf_2016
  5. java成绩排名平均成绩_java 数组 输入5名学生的成绩 得出平均分。
  6. 语音通话框架_教资公告还没出,普通话测试又要改革?
  7. Python单例模式中几种实现及优化方法
  8. Python必学内容:格式化输出的三种方式
  9. python 关于排序的问题
  10. python命名元组