八大内部排序

先来看看8种排序之间的关系:

 八大内部排序

一、直接插入排序

代码如下

 1 public void inerrtSort(int[] a) {
 2         int len = a.length;
 3         for (int i = 1; i < len; i++) {
 4             int tem = a[i];
 5             int j;
 6             for ( j = i - 1; j >= 0 && tem < a[j]; j--) {
 7                 // tem < a[j]只能在for里面判断 否则就算找tem >= a[j]也会一直到j=0,错误移动元素
 8                 a[j+1 ] = a[j];//向后移动
 9             }
10             a[j+1] =tem;
11         }
12     }
//看起来简单 实则有太多细节

 

二、希尔排序

 public  void shellSort(int[] list) {
        int len = list.length ;
        // 取增量
        int gap = len / 2;

        while (gap >= 1) {
            // 无序序列
            for (int i = gap; i < len; i++) {
                int temp = list[i];
                int j;

                // 有序序列
                for (j = i - gap; j >= 0 && list[j] > temp; j = j - gap) {
                    list[j + gap] = list[j];
                }
                list[j + gap] = temp;
            }

            // 缩小增量
            gap = gap / 2;
        }
    }

 

第三、简单选择排序

public void selectSort(int[] a) {
        for (int i = 0; i < a.length ; i++) {
            int min= i;
            for (int j = i+1; j <a.length ; j++) {
               if(a[min] > a[j]) min = j;
            }
            if(min != i){
                int tem = a[min];
                a[min] = a[i];
                a[i] = tem;
            }

        }

    }

  

 

第四、堆排序

 

 

 

 

第五、冒泡排序

public  void bubbleSort(int[] a) {
        int len = a.length-1;

        for (int i = 0; i < len; i++) {
            for (int j = 0; j <len-i ; j++) {
                if (a[j] > a[j+1]){
                    int temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                }
            }
        }
    }

 

 第六、快排

 public static void quickSort(int[] list, int left, int right) {
        if (left < right) {
            // 分割数组,找到分割点
            int point = partition(list, left, right);

            // 递归调用,对左子数组进行快速排序
            quickSort(list, left, point - 1);
            // 递归调用,对右子数组进行快速排序
            quickSort(list, point + 1, right);
        }
    }

    /**
     * 分割数组,找到分割点
     */
    public static int partition(int[] list, int left, int right) {
        // 用数组的第一个元素作为基准数
        int first = list[left];
        while (left < right) {
            while (left < right && list[right] >= first) {
                right--;
            }
            // 交换
            swap(list, left, right);

            while (left < right && list[left] <= first) {
                left++;
            }
            // 交换
            swap(list, left, right);
        }
        // 返回分割点所在的位置
        return left;
    }

    /**
     * 交换数组中两个位置的元素
     */
    public static void swap(int[] list, int left, int right) {
        int temp;
        if (list != null && list.length > 0) {
            temp = list[left];
            list[left] = list[right];
            list[right] = temp;
        }
    }

 

第七、归并排序

 

第八、基数排序

 

参考:https://blog.csdn.net/jiangwei0910410003/article/details/38261783

 

上一篇:立方变自身


下一篇:常见的排序算法