常用排序算法

分类
1)插入排序(直接插入排序、希尔排序)
2)交换排序(冒泡排序、快速排序)
3)选择排序(直接选择排序、堆排序)
4)归并排序
5)分配排序(基数排序)

直接插入排序(正序)

从数组arr第二位开始循环 用变量 value 记录当前循环的值,然后和数组中当前循环位置前面的每一个值去对比,如果大于当前循环值 value 就右移一位,直到数值小于当前循环值 value ,记录下小于循环值 value 的数值的索引加一值count,然后将变量 i 的值放到索引count的位置 循环结束 排序完成 一共循环两次。

简单理解:把最小值往前移

public static void insertSort(int[] arr){
     if(arr.length>0){
       for(int i=1;i<arr.length;i++){
             int j = i;
             int value = arr[i];
             while(j > 0 && value < arr[j-1]){
                   arr[j] = arr[j-1];
                   j--;
             }
             arr[j] = value;
       }
     }
}

冒泡排序

从左边第一位开始循环到最后对比相邻的两个数值的大小,大的右移,小的左移,第一遍完成后,最后一位已经是最大值。第二遍还是从第一位开始循环,循环到length-1,以此类推,一直循环,直到第一位为最小值。

简单理解:把最大值往后移

public static void bubbleSort(int[] arr){
       for(int i = 0;i < arr.length-1; i++){
              for(int j=0;j< arr.length-i-1;j++){
                     if(arr[j]>arr[j+1]){
                           int a = arr[j];
                           int b = arr[j+1];
                           arr[j] = b;
                           arr[j+1] = a;
                     }
              }
       }    
}

3、快速排序

通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,则分别对这两部分继续进行排序,直到整个序列有序。
快速排序首先要选定一个基准值,然后有两个指针一起从头和尾切换扫描,对比指针上的值和基准值的大小,前部分扫描如果基准值小于指针值,则将lo位置的值和hi位置的值对换,然后切换到后半部分扫描,以此类推。

简单理解:找一个基准数,然后根据基准数的大小将数组分为大于基准数和小于基准数两个子数组进行排序,然后以此类推,直到所有的排好

public static void fastSort(int[] array){
       fastSort(array,0,array.length - 1);
}

public static void fastSort(int[] array,int lo,int hi) {
    if(lo>=hi){
        return ;
    }
    int index=sort1(array,lo,hi);
    fastSort(array,lo,index-1);
    fastSort(array,index+1,hi);
}

public static Integer sort1(int[] array, int lo, int hi) {
       int key=array[lo];
       while (lo < hi) {
              while (array[hi] >= key && hi > lo) {//从后半部分
                     hi--;
              }
              array[lo] = array[hi];
              while (array[lo] <= key && hi > lo) {//从前半部分
                     lo++;
              }
              array[hi] = array[lo];
       }
       array[hi]=key;
       return hi;
}

  转载请注明: 心的足迹 常用排序算法

 上一篇
java虚拟机内存模型 java虚拟机内存模型
程序计数器记录程序运行的下一条指令的地址,在多线程环境下,每一个线程都有自己的程序计数器虚拟机栈(JVM Stack)虚拟机栈是Java方法执行的内存模型,每个方法执行的时候,会在栈中创建一帧用于存储局部变量表、操作数栈、动态链接、方法出
2019-12-15
下一篇 
手写HashMap 手写HashMap
JAVA1.7 和 JAVA1.8 中HashMap的主要区别 1、数据结构不一样JAVA1.7 数组、链表JAVA1.8 数组、链表、红黑树 2、put方式不一样在JAVA1.7的时候是直接加入到链头,比较简单粗暴在JAVA1.8
2019-11-15
  目录