java面试重点-java基础 常用排序算法(4种)

冒泡排序

7789414-9c7908de122ee2d6.gif

写法:

public static void bubbleSort(int[] arr) {

    if (arr == null || arr.length < 2) {
        return;
    }

    for(int i = arr.length - 1; i > 0; i--) {
        for(int j = 0; j < i; j++) {
            if(arr[j] > arr[j + 1]) {
                swap(arr, j, j + 1);
            }
        }
    }

}

public static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

特点: 效率低,容易实现。

思想: 每一趟从待排序序列选择一个最小的元素放到已排好序序列的末尾,剩下的为待排序序列,重复上述步 骤直到完成排序


选择排序

selectionSort.gif

 @Test
    public void selectSort() {
        int[] arr = {1, 2, 3, 4, 55, 6, 67, 8, 88};

        // 总共要经过 N-1 轮比较
        for (int i = 0; i < arr.length - 1; i++) {
            int min = i;

            // 每轮需要比较的次数 N-i
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[min]) {
                    // 记录目前能找到的最小值元素的下标
                    min = j;
                }
            }

            // 将找到的最小值和i位置所在的值进行交换
            if (i != min) {
                int tmp = arr[i];
                arr[i] = arr[min];
                arr[min] = tmp;
            }

        }

        System.out.println(Arrays.toString(arr));


//输出结果为:1 2 3 4 6 8 55 67 88
    }

特点: 效率低,容易实现。

思想: 每一趟从待排序序列选择一个最小的元素放到已排好序序列的末尾,剩下的为待排序序列,重复上述步 骤直到完成排序


插入排序

insertionSort.gif

@Test
    public void insertionSort(){
        int[] arr = {1, 2, 3, 4, 55, 6, 67, 8, 88};

        int i,j,t=0;
        for (i = 1; i < arr.length; i++) {
            if (arr[i] < arr[i-1]){
                t=arr[i];
                for (j=i-1;j>=0 && t < arr[j]; j--){
                    arr[j+1] = arr[j];
                    //插入arr[i]
                    arr[j+1] = t;
                }
            }
        }

     System.out.println(Arrays.toString(arr));

//输出结果为:1 2 3 4 6 8 55 67 88 
    }

特点: 效率低,容易实现。

思想: 将数组分为两部分,将后部分元素逐一与前部分元素比较,如果前部分元素比 array[i]小,就将前部 分元素往后移动。当没有比 array[i]小的元素,即是合理位置,在此位置插入 array[i]


quickSort.gif

快速排序

public class QuickSort implements IArraySort {

    @Override
    public int[] sort(int[] sourceArray) throws Exception {
        // 对 arr 进行拷贝,不改变参数内容
        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

        return quickSort(arr, 0, arr.length - 1);
    }

    private int[] quickSort(int[] arr, int left, int right) {
        if (left < right) {
            int partitionIndex = partition(arr, left, right);
            quickSort(arr, left, partitionIndex - 1);
            quickSort(arr, partitionIndex + 1, right);
        }
        return arr;
    }

    private int partition(int[] arr, int left, int right) {
        // 设定基准值(pivot)
        int pivot = left;
        int index = pivot + 1;
        for (int i = index; i <= right; i++) {
            if (arr[i] < arr[pivot]) {
                swap(arr, i, index);
                index++;
            }
        }
        swap(arr, pivot, index - 1);
        return index - 1;
    }

    private void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

}

特点: 高效,时间复杂度为 nlogn。 采用分治法的思想:首先设置一个轴值 pivot,然后以这个轴值为划分基准将待排序序列分成比 pivot 大和比 pivot 小的两部分,接下来对划分完的子序列进行快排直到子序列为一个元素为止。


内容整理自菜鸟教程
--https://www.runoob.com/w3cnote/ten-sorting-algorithm.html

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-02 17:28
25届每天都在焦虑找工作的事情0offer情绪一直很低落硬撑着面了一个岗位岗位有应酬的成分面试的时候hr给我出各种场景题问的问题比较犀利&nbsp;有点压力面的感觉感觉有点回答不上来本来就压抑的情绪瞬间爆发了呢一瞬间特别想哭觉得自己特别没用没绷住掉眼泪了事后想想觉得自己挺有病的&nbsp;真的破大防了
喜欢唱跳rap小刺猬...:我觉得没关系吧,之前有一次面试leader给我压力面,我顶住了压力,结果入职的时候发现组里氛围很差,果断跑路。其实从面试就能大概看出组的情况,面试体验好的组倒是不一定好,但是面试体验不好的组。。。就很难说
面试尴尬现场
点赞 评论 收藏
分享
叶扰云倾:进度更新,现在阿里云面完3面了,感觉3面答得还行,基本都答上了,自己熟悉的地方也说的比较细致,但感觉面试官有点心不在焉不知道是不是不想要我了,求阿里收留,我直接秒到岗当阿里孝子,学校那边的房子都退租了,下学期都不回学校,全职猛猛实习半年。这种条件还不诱人吗难道 然后现在约到了字节的一面和淘天的复活赛,外加猿辅导。华为笔试完没动静。 美团那边之前投了个base广州的,把我流程卡麻了,应该是不怎么招人,我直接简历挂了,现在进了一个正常的后端流程,还在筛选,不知道还有没有hc。
点赞 评论 收藏
分享
05-26 09:07
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 13:05
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务