IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 研发工程师面经——常见排序算法 -> 正文阅读

[数据结构与算法]研发工程师面经——常见排序算法

2.排序算法

2.1 快速排序

  • 快速排序的原理就是找到一个基准,然后将大于这个基准和小于这个基准的数字分别放到两边。然后不断的递归,直到只有一个元素的时候,就不用再处理。

在这里插入图片描述

// 在数组中交换下标为x和y的值
public static void exchange(int[] nums,int x, int y){
    int temp=nums[x];
    nums[x]=nums[y];
    nums[y]=temp;
}

public static void QuickSort(int[] nums,int left,int right){
    System.out.println(Arrays.toString(nums));
    // 选取第一个值作为基准值
    if(left<right){
        int key=nums[left];
        int i=left;
        for(int j=left+1;j<=right;j++){
            // 小于表示从大到小,大于表示从小到大
            if(key<nums[j]){
                i++;
                exchange(nums,j,i);
            }
        }
        exchange(nums,left,i);
        QuickSort(nums,left,i-1);
        QuickSort(nums,i+1,right);
    }
}

2.2 冒泡排序

  • 冒泡排序是最简单,最基础的一种。就是一次遍历之后,将最大或者最小的一个放到头部或者尾部。
public static void BubbleSort(int[] array){
    for(int i=0;i<array.length;i++){
        for(int j=0;j<array.length;j++){
            if(array[j]<array[i]){
                int temp=array[i];
                array[i]=array[j];
                array[j]=temp;
            }
        }
    }
}

2.3 插入排序

  • 插入排序和冒泡排序很相似。
public static void SelectSort(int[] array){
    if(array.length==0){
        return;
    }
    for(int i=0;i<array.length;i++){
        int index=i;
        for(int j=i+1;j<array.length;j++){
            if(array[index]>array[j]){
                index=j;
            }
        }
        if(i!=index){
            int temp=array[i];
            array[i]=array[index];
            array[index]=temp;
        }
    }
}

2.4 归并排序

  • 归并排序是把待排序序列分为若干个子序列,每个子序 列是有序的。然后再把有序子序列合并为整体有序序列。
  • 先把待排序列分为两部分,然后各部分再分为两部分,一直分下去,直到不能再分为 止,然后在两两合并两个有序数组,直到合并完为止。有序数组的合并也很好理解,代 码可以参考上面。上面代码在合并的时候都会创建一个临时数组tmp,如果排序的数组 很大的话,每次merge的时候都会浪费大量的空间,不是最好的解决方式,这里可以优化一下。

在这里插入图片描述

    public static void mergeSort(int[] array,int left,int right){
        if(left<right){
            int center=(left+right)>>1;
            mergeSort(array,left,center);
            mergeSort(array,center+1,right);
            merge(array,left,center,right);
        }
    }

    public static void merge(int[] data,int left,int center,int right){
        int[] tmp=new int[data.length];
        int tmpIndex=left;
        // _left表示前半段的第一个位置,_right表示后半段的第一个位置
        int _left=left;
        int _right=center+1;
        while(_left<center&&_right<=right){
            if(data[_left]<data[_right]){
                tmp[tmpIndex++]=data[_left++];
            }else {
                tmp[tmpIndex++]=data[_right++];
            }
        }
        while(_right<=right){
            tmp[tmpIndex++]=data[_right++];
        }
        while (_left<=center){
            tmp[tmpIndex++]=data[_left++];
        }
        while(left<=right){
            data[left]=tmp[left++];
        }
    }

2.5 链表排序

  • 给你链表的头节点head,将其按升序排序。
  • 链表排序就很复杂,因为是单向链表。
  • 我的方式是:
    • 首先虚拟化头节点,然后以头节点为开头和尾节点
    • 然后选择一个指针节点,从头节点后一个节点开始遍历。
    • 小于头节点,就插入头部
    • 大于尾节点,就插入尾部
    • 大于头节点,小于尾节点,就遍历中间的链表,插入相应位置
  • 注意:首先需要确保头尾节点之间的链表是独立隔离的,否则会产生环。
  public ListNode sortList(ListNode head) {
        if(head==null||head.next==null){
            return head;
        }
        // 虚拟化头节点
        ListNode headNode=new ListNode();
        headNode.next=head;
        // 有序链表的尾节点
        ListNode endNode=head;
        // 起始节点node
        ListNode node=head.next;
        endNode.next=null;
        while(node!=null){
            ListNode nodeNext=node.next;
            if(node.val<=headNode.next.val){
                ListNode temp=headNode.next;
                headNode.next=node;
                node.next=temp;
            }else if(node.val>=endNode.val){
                endNode.next=node;
                node.next=null;
                endNode=node;
            }else{
                ListNode temp=headNode.next;
                while(temp!=endNode){
                    if(temp.next.val>=node.val){
                        ListNode tempNext=temp.next;
                        temp.next=node;
                        node.next=tempNext;
                        break;
                    }
                    temp=temp.next;
                }
            }
            node=nodeNext;
        }
        return headNode.next;
    }
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-10-08 21:07:03  更:2022-10-08 21:11:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:18:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码