zoukankan      html  css  js  c++  java
  • 栈和队列----单链表的选择排序

    单链表的选择排序

      

      给定一个无序单链表的头节点 head,实现单链表的选择排序,要求额外空间复杂度是 O(1)

      

      【解析】

      要求额外空间复杂度是 O(1),所以不能使用数组等容器进行排序,直接使用几个变量

      选择排序是在从未排序部分选择最小值,然后放在排序部分的尾部,逐渐将未排序部分缩小,最后变成排好序的部分。

    package com.test;
    
    import com.test.ListNode;
    
    /**
     * Created by Demrystv.
     */
    public class SelectionSortOfListNode {
    
        /*
        1. 开始时默认整个链表都是未排序的部分,对于找到的第一个最小值节点,肯定是整个链表的最小节点,将其设置为newHead
        2. 每次在未排序部分中找到最小值的节点,然后把这个节点从未排序的链表中删除,删除某个节点一定要找到这个节点的前一个节点
        3. 把删除的节点(也就是每次的最小值节点)连接到排好序部分的链表尾部。
        4. 全部过程处理完毕后,整个链表都已经有序,返回newHead
         */
        public ListNode selectionSort(ListNode head){
            ListNode tail = null; //已排序部分的尾部
            ListNode cur = head;  // 为排序部分的头部
            ListNode smallPre = null; //最小节点的头一个节点
            ListNode small = null; // 最小节点
    
            while (cur != null){
                small = cur;
                smallPre = getSmallPre(head);
                if (smallPre != null){
                    small = smallPre.next;
                    smallPre.next = small.next;
                }
                cur = cur == small ? cur.next : cur;
                if (tail == null){
                    head = small;
                }else {
                    tail.next = small;
                }
                tail = small;
            }
            return head;
        }
    
        public ListNode getSmallPre(ListNode head){
            ListNode smallPre = null;
            ListNode small = head;
            ListNode pre = head;
            ListNode cur = head.next;
    
            while (cur != null){
                if (cur.val < small.val){
                    small = cur;
                    smallPre = pre;
                }
                pre = cur;
                cur = cur.next;
            }
            return smallPre;
        }
    
    }
  • 相关阅读:
    进程通信
    Python爬虫获取随机的UserAgent的两种方法
    Chrome插件【请停用以开发者模式运行的扩展程序】的提示解决方案
    FCFS,SJF,HRRN调度算法总结分析(全)
    进程控制
    进程的状态和转换
    进程的调用
    系统调用
    终端和异常
    今日份崩溃——时刻注意细节
  • 原文地址:https://www.cnblogs.com/Demrystv/p/9364171.html
Copyright © 2011-2022 走看看