美文网首页应届生互联网求职面试总结分享
链表排序算法java实现(链表的快速排序、插入排序、归并排序)

链表排序算法java实现(链表的快速排序、插入排序、归并排序)

作者: 大菜鸟_ | 来源:发表于2018-10-27 16:38 被阅读0次

难易程度:★★

重要性:★★★

链表的排序相对数组的排序更为复杂些,也是考察求职者是否真正理解了排序算法(而不是“死记硬背”)

链表的插入排序

public  class LinkedInsertSort {
    static class ListNode {
        int val;
        ListNode next;
        ListNode(int x) {
            val = x;
            next = null;
        }
    }

    public static ListNode insertionSortList(ListNode head) {
        if(head==null||head.next==null)    return head;

        ListNode pre = head;//pre指向已经有序的节点
        ListNode cur = head.next;//cur指向待排序的节点

        ListNode aux = new ListNode(-1);//辅助节点
        aux.next = head;

        while(cur!=null){
            if(cur.val<pre.val){
              //先把cur节点从当前链表中删除,然后再把cur节点插入到合适位置
                pre.next = cur.next;

                //从前往后找到l2.val>cur.val,然后把cur节点插入到l1和l2之间
                ListNode l1 = aux;
                ListNode l2 = aux.next;
                while(cur.val>l2.val){
                    l1 = l2;
                    l2 = l2.next;
                }
                //把cur节点插入到l1和l2之间
                l1.next = cur;
                cur.next = l2;//插入合适位置

                cur = pre.next;//指向下一个待处理节点

            }else{
                pre = cur;
                cur = cur.next;
            }
        }
        return aux.next;
    }
}```


链表的快速排序
```public static ListNode quickSort(ListNode begin, ListNode end) {
        //判断为空,判断是不是只有一个节点
        if (begin == null || end == null || begin == end)
            return begin;
        //从第一个节点和第一个节点的后面一个几点
        //begin指向的是当前遍历到的最后一个<= nMidValue的节点
        ListNode first = begin;
        ListNode second = begin.next;

        int nMidValue = begin.val;
        //结束条件,second到最后了
        while (second != end.next && second != null) {//结束条件
          //一直往后寻找<=nMidValue的节点,然后与fir的后继节点交换
            if (second.val < nMidValue) {
                first = first.next;
                //判断一下,避免后面的数比第一个数小,不用换的局面
                if (first != second) {
                    int temp = first.val;
                    first.val = second.val;
                    second.val = temp;
                }
            }
            second = second.next;
        }
        //判断,有些情况是不用换的,提升性能
        if (begin != first) {
            int temp = begin.val;
            begin.val = first.val;
            first.val = temp;
        }
        //前部分递归
        quickSort(begin, first);
        //后部分递归
        quickSort(first.next, end);
        return begin;
    }```


链表的归并排序

public ListNode mergeSort(ListNode head){
if(head==null || head.next==null) return head;

    ListNode mid = getMid(head);//获取链表中间节点

    //把链表从之间拆分为两个链表:head和second两个子链表
    ListNode second = mid.next;
    mid.next = null;

    //对两个子链表排序
    ListNode left = mergeSort(head);
    ListNode right = mergeSort(second);

    return merge(right,left);      
}

//两个有序链表的归并
private ListNode merge(ListNode l1,ListNode l2){
  //辅助节点,排好序的节点将会链接到dummy后面
    ListNode dummy = new ListNode(0);

    ListNode tail = dummy;//tail指向最后一个排好序的节点
    while(l1!=null&&l2!=null){
        if(l1.val<=l2.val){
            tail.next = l1;
            l1 = l1.next;
        }else{
            tail.next = l2;
            l2 = l2.next;
        }
        tail = tail.next; //移动tail指针        
    }

    if(l1!=null)
        tail.next = l1;
    else
        tail.next = l2;

    return dummy.next;

}

//返回链表之间节点
private ListNode getMid(ListNode head){
    if(head==null ||head.next==null)    return head;

    ListNode slow = head;
    ListNode faster = head.next;
    while(faster!=null&&faster.next!=null){
        slow = slow.next;
        faster = faster.next.next;
    }
    return slow;
}```

扫描下方二维码,及时获取更多互联网求职面经javapython爬虫大数据等技术,和海量资料分享
公众号菜鸟名企梦后台发送“csdn”即可免费领取【csdn】和【百度文库】下载服务;
公众号菜鸟名企梦后台发送“资料”:即可领取5T精品学习资料java面试考点java面经总结,以及几十个java、大数据项目资料很全,你想找的几乎都有

扫码关注,及时获取更多精彩内容。(博主今日头条大数据工程师)

相关文章

  • Algorithm -- 排序算法

    单链表十大经典排序算法冒泡排序选择排序插入排序归并排序快速排序堆排序计数排序桶排序 1. 十大经典排序算法 十大经...

  • 十大经典排序算法(java实现)

    前言 本文我们将以java代码实现十大经典排序算法,包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序...

  • 盘点常用Java排序算法

    本文主要介绍Java的七种常见排序算法的实现,对选择排序、插入排序、冒泡排序、归并排序、快速排序、希尔排序、最小堆...

  • 盘点常用Java排序算法

    本文主要介绍Java的七种常见排序算法的实现,对选择排序、插入排序、冒泡排序、归并排序、快速排序、希尔排序、最小堆...

  • 常见算法

    单链表反转 冒泡排序 选择排序 插入排序 希尔排序 快速排序 归并排序 堆排序 二分查找 重建二叉树

  • 数据结构&算法(一)

    一、Java实现快速排序算法 二、Java实现折半插入排序算法 三、Java实现冒泡排序算法

  • Datawhale | 编程第6期 Test 3

    排序 1.实现归并排序、快速排序、插入排序、冒泡排序、选择排序、堆排序(选做) 归并排序 快速排序 插入排序 冒泡...

  • 前端基础整理 | 算法基础

    排序算法 冒泡排序 选择排序 插入排序 希尔排序 归并排序 堆排序 快速排序

  • 排序算法总结(java版本)

    难易程度:★ 重要性:★★★★★ 包含了:链表的快速排序和链表的归并排序 在理解的基础上掌握上述算法的实现,其中快...

  • leetcode的题目147

    147. 对链表进行插入排序 对链表进行插入排序。 插入排序算法: 插入排序是迭代的,每次只移动一个元素,直到所有...

网友评论

    本文标题:链表排序算法java实现(链表的快速排序、插入排序、归并排序)

    本文链接:https://www.haomeiwen.com/subject/czpdtqtx.html