java程序员必知的 8大排序 Java常用的八种排序算法与代码实现 1.直接插入排序 2.希尔排序 3.简单选择排序 4.堆排序 5.冒泡排序 6.快速排序 7.归并排序 8.基数排序

排序问题一直是程序员工作与面试的重点,今天特意整理研究下与大家共勉!这里列出8种常见的经典排序,基本涵盖了所有的排序算法。

java程序员必知的 8大排序
Java常用的八种排序算法与代码实现
1.直接插入排序
2.希尔排序
3.简单选择排序
4.堆排序
5.冒泡排序
6.快速排序
7.归并排序
8.基数排序

1.直接插入排序

      我们经常会到这样一类排序问题:把新的数据插入到已经排好的数据列中。将第一个数和第二个数排序,然后构成一个有序序列将第三个数插入进去,构成一个新的有序序列。对第四个数、第五个数……直到最后一个数,重复第二步。如题所示:

java程序员必知的 8大排序
Java常用的八种排序算法与代码实现
1.直接插入排序
2.希尔排序
3.简单选择排序
4.堆排序
5.冒泡排序
6.快速排序
7.归并排序
8.基数排序

直接插入排序(Straight Insertion Sorting)的基本思想:在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。

代码:

/**
 *
 * 基本思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置(从后向前找到合适位置后),直到全部插入排序完为止。
 * @author kancy
 * @version 1.0
 * @date 2019/4/1 17:31
 */
public class InsertSort {
    public static void main(String[] args) {
        int[] ints = RandomUtil.createIntArray(0, 10, 10);
        System.out.println(Arrays.toString(ints));
        int j = 0;
        int curr = 0;
        for (int i = 0; i < ints.length; i++) {
            curr = ints[i];
            for (j = i; j > 0 ; j--) {
                if(ints[j-1] <= curr){
                    break;
                }
                ints[j] = ints[j-1];
            }
            ints[j] = curr;
        }
        System.out.println(Arrays.toString(ints));

    }
}

2.希尔排序

      针对直接插入排序的下效率问题,有人对次进行了改进与升级,这就是现在的希尔排序。希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。

希尔排序是基于插入排序的以下两点性质而提出改进方法的:

  • 插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率
  • 但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位

如图所示:

java程序员必知的 8大排序
Java常用的八种排序算法与代码实现
1.直接插入排序
2.希尔排序
3.简单选择排序
4.堆排序
5.冒泡排序
6.快速排序
7.归并排序
8.基数排序

将数的个数设为n,取奇数k=n/2,将下标差值为k的数分为一组,构成有序序列。

再取k=k/2 ,将下标差值为k的书分为一组,构成有序序列。

重复第二步,直到k=1执行简单插入排序。

 

3.简单选择排序

常用于取序列中最大最小的几个数时。

(如果每次比较都交换,那么就是交换排序;如果每次比较完一个循环再交换,就是简单选择排序。)

遍历整个序列,将最小的数放在最前面。

遍历剩下的序列,将最小的数放在最前面。

重复第二步,直到只剩下一个数。

 

java程序员必知的 8大排序
Java常用的八种排序算法与代码实现
1.直接插入排序
2.希尔排序
3.简单选择排序
4.堆排序
5.冒泡排序
6.快速排序
7.归并排序
8.基数排序

4.堆排序

对简单选择排序的优化。

将序列构建成大顶堆。

将根节点与最后一个节点交换,然后断开最后一个节点。

重复第一、二步,直到所有节点断开

 java程序员必知的 8大排序
Java常用的八种排序算法与代码实现
1.直接插入排序
2.希尔排序
3.简单选择排序
4.堆排序
5.冒泡排序
6.快速排序
7.归并排序
8.基数排序

 

5.冒泡排序

很简单,用到的很少,据了解,面试的时候问的比较多!

将序列中所有元素两两比较,将最大的放在最后面。

将剩余序列中所有元素两两比较,将最大的放在最后面。

重复第二步,直到只剩下一个数。

java程序员必知的 8大排序
Java常用的八种排序算法与代码实现
1.直接插入排序
2.希尔排序
3.简单选择排序
4.堆排序
5.冒泡排序
6.快速排序
7.归并排序
8.基数排序

 

6.快速排序

要求时间最快时。

选择第一个数为p,小于p的数放在左边,大于p的数放在右边。

递归的将p左边和右边的数都按照第一步进行,直到不能递归。

 java程序员必知的 8大排序
Java常用的八种排序算法与代码实现
1.直接插入排序
2.希尔排序
3.简单选择排序
4.堆排序
5.冒泡排序
6.快速排序
7.归并排序
8.基数排序

代码:

public void quickSort(int[]a,int start,int end){
           if(start<end){
               int baseNum=a[start];//选基准值
               int midNum;//记录中间值
               int i=start;
               int j=end;
               do{
                   while((a[i]<baseNum)&&i<end){
                       i++;
                   }
                   while((a[j]>baseNum)&&j>start){
                       j--;
                   }
                   if(i<=j){
                       midNum=a[i];
                       a[i]=a[j];
                       a[j]=midNum;
                       i++;
                       j--;
                   }
               }while(i<=j);
                if(start<j){
                    quickSort(a,start,j);
                }       
                if(end>i){
                    quickSort(a,i,end);
                }
           }
       }

7.归并排序

速度仅次于快速排序,内存少的时候使用,可以进行并行计算的时候使用。

选择相邻两个数组成一个有序序列。

选择相邻的两个有序序列组成一个有序序列。

重复第二步,直到全部组成一个有序序列。

java程序员必知的 8大排序
Java常用的八种排序算法与代码实现
1.直接插入排序
2.希尔排序
3.简单选择排序
4.堆排序
5.冒泡排序
6.快速排序
7.归并排序
8.基数排序

 

8.基数排序

用于大量数,很长的数进行排序时。

将所有的数的个位数取出,按照个位数进行排序,构成一个序列。

将新构成的所有的数的十位数取出,按照十位数进行排序,构成一个序列。

 

参考:

https://www.cnblogs.com/10158wsj/p/6782124.html

https://blog.csdn.net/without0815/article/details/7697916

https://www.cnblogs.com/0201zcr/p/4763806.html