• [算法] 单链表插入排序(java)


    实现

    • 首先保证插入前的链表是个完整的,最后一个节点要断开
    • 然后在插入前链表中找到比待插入节点大的最小元素,插到前面即可

    Link.java

    class Link {
    
        private class Node {
            int data;
            Node next;
    
            public Node(int x) {
                data = x;
            }
            public void addNode(Node newNode){
                if(this.next == null){
                    this.next = newNode;
                }else{
                    this.next.addNode(newNode);
                }
            }
        }
    
        public Node root;
    
        public void add(int data){
            Node newNode = new Node(data);
            if(this.root==null){
                this.root=newNode;
            }else{
                this.root.addNode(newNode);
            }
        }
    
        public void printLink(){
            Node head = this.root;
            while(head!=null) {
                System.out.println(head.data);
                head = head.next;
            }
        }
    
        public void insertionSortList() {
            Node head = this.root;
            if(head==null || head.next==null)
                return;
            Node dummy = new Node(-1);
            dummy.next = head;
            Node cur = head.next;
            head.next = null;
            while(cur != null) {
                Node pre = dummy;
                Node temp = cur.next;
    
                while (pre.next!=null && cur.data > pre.next.data){
                    pre = pre.next;
                }
    
                cur.next = pre.next;
                pre.next = cur;
                cur = temp;
            }
            this.root=dummy.next;
            return;
        }
    }
    

    main.java

    import java.lang.reflect.Array;
    
    public class Main {
    
        public static void main(String[] args) {
           Link all = new Link();
    
           int data[] = new int[]{5,4,3,2,1};
    
    //       for(int i = 0;i < data.length;i++){
    //           data[i] = i;
    //       }
    
    //       data[0] = 0;
    //       int j = data.length-1;
    //       for(int i = 1;i < data.length;i++){
    //           data[i] = j;
    //           j--;
    //       }
    
    //        int j = data.length;
    //        for(int i = 0;i < data.length;i++){
    //            data[i] = j;
    //            j--;
    //        }
    
            for(int i = 0;i < data.length;i++){
                System.out.println(data[i]);
            }
    
    
           for(int i = 0;i < data.length;i++){
               all.add(data[i]);
           }
    
            long startTime=System.currentTimeMillis();
            all.insertionSortList();
            long endTime=System.currentTimeMillis();
            System.out.println(endTime-startTime);
    
            System.out.println("==================");
            all.printLink();
    
        }
    }
    

    数据结构分析

    • 倒序链表:3->2->1
      data  next   
         R1  R2
    A  3  B null  null 
     2   C 
     1  null   
     -1  A 
    • 顺序链表:1->2->3
      data  next   
         R1  R2
    A  1  B  B  B
     2   C   C   C 
     3  null   null   null 
     -1  A   A   A 
    • 乱序链表:3->2->4
      data  next   
         R1  R2
    A  3  B null   C
     2   C 
     4 null    null 
     -1  A    B  B

    变量分析

    • 共需定义5个变量:head、dummy、cur、pre、temp,可分为两类
    • head、dummy、cur为初始变量,即为了操作链表初始创建的变量,head是链表头节点,dummy是哑节点,用于操作头节点,cur为当前节点,为头节点的下一个节点
    • pre、temp为循环变量,是为了在循环中的操作创建,pre从哑节点开始,每次循环后移,比较每个元素和cur的大小,到cur的前一节点为止,temp是cur的下一个节点,用于在循环中将cur后移

     

     

     

     

      

  • 相关阅读:
    OCR中表格识别及WORD生成
    太阳能跟踪系统
    QA300太阳能移动电源
    OCR之表格识别
    2012112
    2012123
    2012121
    2011101
    201191
    2011828
  • 原文地址:https://www.cnblogs.com/cxc1357/p/13974842.html
Copyright © 2020-2023  润新知