常用排序算法汇总

排序算法汇总(软考的可以看看)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

一、冒泡排序

1.1 算法描述

1、比较相邻的元素。如果第一个比第二个大,就交换它们两个;  
2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;  
3、针对所有的元素重复以上的步骤,除了最后一个;   
重复步骤1~3,直到排序完成。

1.2 java代码

package my.sortingAlgorithm;

import java.util.Arrays;

/**
 * 冒泡排序
 * 1、比较相邻的元素。如果第一个比第二个大,就交换它们两个;
 * 2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
 * 3、针对所有的元素重复以上的步骤,除了最后一个;
 * 重复步骤1~3,直到排序完成。
 */
public class bubbleSort {
    public static int[] bubbleSort(int[] array) {
        if (array.length == 0)
            return array;
        for (int i = 0; i < array.length; i++)
            for (int j = 0; j < array.length - 1 - i; j++)
                if (array[j + 1] < array[j]) {
                    int temp = array[j + 1];
                    array[j + 1] = array[j];
                    array[j] = temp;
                }
        return array;
    }

    public static void main(String[] args) {
        int[] arr = {2, 4, 1, 9, 19, 3, 5};
        int[] ints = bubbleSort(arr);
        System.out.println(Arrays.toString(ints));
    }
}


1.3 动画展示

请添加图片描述

二、选择排序

1.1 算法描述

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到
已排序序列的末尾。以此类推,直到所有元素均排序完毕。

1.2 java代码

package my.sortingAlgorithm;

import java.util.Arrays;

public class selectionSort {
    /**
     * 选择排序
     *
     * @param array
     * @return
     */
    public static int[] selectionSort(int[] array) {
        if (array.length == 0)
            return array;
        for (int i = 0; i < array.length; i++) {
            int minIndex = i;
            for (int j = i; j < array.length; j++) {
                if (array[j] < array[minIndex]) //找到最小的数
                    minIndex = j; //将最小数的索引保存
            }
            int temp = array[minIndex];
            array[minIndex] = array[i];
            array[i] = temp;
        }
        return array;
    }

    public static void main(String[] args) {
        int[] arr = {2, 4, 1, 9, 19, 3, 5};
        int[] ints = selectionSort(arr);
        System.out.println(Arrays.toString(ints));
    }
}


1.3 动画展示

请添加图片描述

三、插入排序

1、算法描述

1、从第一个元素开始,该元素可以认为已经被排序;
2、取出下一个元素,在前面已排序的元素序列中,从后向前扫描;
3、如果该元素(已排序)大于新元素,将该元素移到下一位置;
4。重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
5、将新元素插入到该位置后;
6、重复步骤2~5

2、java 代码

package my.sortingAlgorithm;

import java.util.Arrays;

public class InsertSort {
    /**
     * 插入排序
     *
     * @param array
     * @return
     */
    public static int[] InsertSort(int[] array) {
        if (array == null || array.length < 2) {
            return array;
        }
        for (int i = 0; i < array.length - 1; i++) {
            //当前值
            int curr = array[i + 1];
            //上一个数的指针
            int preIndex = i;
            //在数组中找到一个比当前遍历的数小的第一个数
            while (preIndex >= 0 && curr < array[preIndex]) {
                //把比当前遍历的数大的数字往后移动
                array[preIndex + 1] = array[preIndex];
                //需要插入的数的下标往前移动
                preIndex--;
            }
            //插入到这个数的后面
            array[preIndex + 1] = curr;
        }
        return array;
    }

    public static void main(String[] args) {
        int[] arr = {2, 4, 1, 9, 19, 3, 5};
        int[] ints = InsertSort(arr);
        System.out.println(Arrays.toString(ints));
    }
}

3、动画展示

请添加图片描述

四、希尔排序(插入排序优化版)

1、算法描述

1、把数组分割成若干(h)个小组(一般数组长度length/2)
2、然后对每一个小组分别进行插入排序
3、每一轮分割的数组的个数逐步缩小,h/2->h/4->h/8,并且进行排序,保证有序。
4、当h=1时,则数组排序完成。

2、java 代码

package my.sortingAlgorithm;

import java.util.Arrays;

public class ShellSort {
    /**
     * 希尔排序
     *
     * @param array
     * @return
     */
    public static int[] ShellSort(int[] array) {
        if (array == null || array.length < 2) {
            return array;
        }
        int length = array.length;
        int temp;
        //步长
        int gap = length / 2;
        while (gap > 0) {
            for (int i = gap; i < length; i++) {
                temp = array[i];
                int preIndex = i - gap;
                while (preIndex >= 0 && array[preIndex] > temp) {
                    array[preIndex + gap] = array[preIndex];
                    preIndex -= gap;
                }
                array[preIndex + gap] = temp;
            }
            gap /= 2;
        }
        return array;
    }

    public static void main(String[] args) {
        int[] arr = {2, 4, 1, 9, 19, 3, 5};
        int[] ints = ShellSort(arr);
        System.out.println(Arrays.toString(ints));
    }
}

3、动画展示

请添加图片描述

五、快速排序

1、算法描述

1、从数组中选一个数做为基准值,一般选第一个数,或者最后一个数。
2、采用双指针(头尾两端)遍历,从左往右找到比基准值大的第一个数,从右往左找到比基准值小的第一个数,交换两数位置,直到头尾指针相等
或头指针大于尾指针,把基准值与头指针的数交换。这样一轮之后,左边的数就比基准值小,右边的数就比基准值大。
3、对左边的数列,重复上面12步骤。对右边重复12步骤。
4、左右两边数列递归结束后,排序完成。

2、java 代码

package my.sortingAlgorithm;

import java.util.Arrays;

public class QuickSort {
    /**
     * 快速排序 分治思想
     *
     * @param array
     * @return
     */
    public static void quickSort(int[] array, int start, int end) {
        if (start > end) {
            return;
        }
        int i = start;
        int j = end;
        int key = array[start];
        while (i < j) {
            while (i < j && array[j] > key) {
                j--;
            }
            while (i < j && array[i] <= key) {
                i++;
            }
            if (i < j) {
                int temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
        array[start] = array[i];
        array[i] = key;
        quickSort(array, start, i - 1);
        quickSort(array, i + 1, end);
    }

    static int[] sort(int[] array) {
        if (array == null || array.length < 2) {
            return array;
        }
        quickSort(array, 0, array.length - 1);
        return array;
    }

    public static void main(String[] args) {
        int[] arr = {2, 4, 1, 9, 19, 3, 5};
        int[] ints = sort(arr);
        System.out.println(Arrays.toString(ints));
    }
}

3、动画展示

请添加图片描述

六、归并排序

1、算法描述

1、把数组不断划分成子序列,划成长度只有2或者1的子序列。
2、然后利用临时数组,对子序列进行排序,合并,再把临时数组的值复制回原数组。
3、反复操作1~2步骤,直到排序完成。

2、java代码

package my.sortingAlgorithm;

import java.util.Arrays;

public class MergeSort {
    /**
     * 归并排序
     * @param star
     * @param end
     * @param nums
     * @param temp
     */
    private static int[] mergeSort(int star, int end, int[] nums, int[] temp) {
        if (nums == null || nums.length < 2) {
            return nums;
        }
        //递归终止条件
        if (star >= end) {
            return nums;
        }
        int mid = star + (end - star) / 2;
        //左边进行归并排序
        mergeSort(star, mid, nums, temp);
        //右边进行归并排序
        mergeSort(mid + 1, end, nums, temp);
        //合并左右
        int[] merge = merge(star, end, mid, nums, temp);
        return merge;
    }
    private static int[] merge(int star, int end, int mid, int[] nums, int[] temp) {
        int index = 0;
        int i = star;
        int j = mid + 1;
        while (i <= mid && j <= end) {
            if (nums[i] > nums[j]) {
                temp[index++] = nums[j++];
            } else {
                temp[index++] = nums[i++];
            }
        }
        while (i <= mid) {
            temp[index++] = nums[i++];
        }
        while (j <= end) {
            temp[index++] = nums[j++];
        }
        //把临时数组中已排序的数复制到nums数组中
        if (index >= 0) System.arraycopy(temp, 0, nums, star, index);
        return nums;
    }
    public static void main(String[] args) {
        int[] arr = {2, 4, 1, 9, 19, 3, 5};
        int[] ints = mergeSort(0, arr.length - 1, arr, new int[arr.length]);
        System.out.println(Arrays.toString(ints));
    }
}

3、动画展示

在这里插入图片描述

7、堆排序

1、排序原理

1、对原数组构建成大顶堆。
2、交换头尾值,尾指针索引减一,固定最大值。
3、重新构建大顶堆。
4、重复步骤2~3,直到最后一个元素,排序完成。

2、java代码

package my.sortingAlgorithm;

import java.util.Arrays;

/**
 * 堆排序
 */
public class heapSort {
    public static void heapify(int[] arr, int len, int i) {
        int largest = i;
        int lson = i * 2 + 1;
        int rson = i * 2 + 2;
        if (lson < len && arr[largest] < arr[lson]) {
            largest = lson;
        }
        if (rson < len && arr[largest] < arr[rson]) {
            largest = rson;
        }
        if (largest != i) {
            swap(arr, largest, i);
            //因为交换破坏了稳定,需要把largest的重新组合
            heapify(arr, len, largest);
        }
    }

    /**
     * 堆排序入口
     * @param arr
     * @param len
     */
    static void heap_sort(int arr[], int len) {
        //第一步构建大顶堆
        for (int i = len / 2 - 1; i >= 0; i--) {
            heapify(arr, len, i);
        }
        //第二步排序
        for (int i = len - 1; i > 0; i--) {
            swap(arr, i, 0);
            heapify(arr, i, 0);
        }
    }

    /**
     * 交换
     * @param arr
     * @param left
     * @param right
     */
    static void swap(int[] arr, int left, int right) {
        int temp = arr[left];
        arr[left] = arr[right];
        arr[right] = temp;
    }

    public static void main(String[] args) {
        int[] arr = {2, 4, 1, 9, 19, 3, 5};
        heap_sort(arr, arr.length);
        System.out.println(Arrays.toString(arr));
    }
}

3、动画演示

请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值