zoukankan      html  css  js  c++  java
  • 单链表的选择排序

    【说明】:

      本文是左程云老师所著的《程序员面试代码指南》第二章中“单链表的选择排序”这一题目的C++复现。

      本文只包含问题描述、C++代码的实现以及简单的思路,不包含解析说明,具体的问题解析请参考原书。

      感谢左程云老师的支持。

    【题目】:

      给定一个无序单链表的头节点 head,实现单链表的选择排序。

      要求:额外的空间复杂读为 O(1)。

     【思路】:

      解法:选择排序

    【编译环境】:

      CentOS6.7(x86_64)

      gcc 4.4.7

     【实现】:

      实现及测试代码:

      1 /*
      2  *文件名:list_sort.cpp
      3  *作者
      4  *摘要:单链表的选择排序
      5  */
      6 
      7 #include <iostream>
      8 
      9 using namespace std;
     10 
     11 class Node
     12 {
     13 public:
     14     Node(int data)
     15     {
     16         value = data;
     17         next = NULL;
     18     }
     19 public:
     20     int value;
     21     Node *next;
     22 };
     23 
     24 Node* getSmallestPreNode(Node *head)    //获取未排序链表中最小节点的前一个节点
     25 {
     26     Node *smallPre = NULL;
     27     Node *small = head;
     28     Node *pre = head;
     29     Node *cur = head->next;
     30     while(NULL != cur)
     31     {
     32         if(cur->value < small->value)
     33         {
     34             smallPre = pre;
     35             small = cur;
     36         }
     37         pre = cur;
     38         cur = cur->next;
     39     }
     40     return smallPre;
     41 }
     42 
     43 Node* selectionSort(Node *head)
     44 {
     45     Node *tail = NULL;    //已排序部分的尾部
     46     Node *cur = head;     //未排序部分的头部
     47     Node *smallPre = NULL;
     48     Node *small = NULL;
     49     while(NULL != cur)
     50     {
     51         small = cur;
     52         smallPre = getSmallestPreNode(cur);
     53         if(NULL != smallPre)
     54         {
     55             small = smallPre->next;
     56             smallPre->next = small->next;
     57         }
     58         cur = cur == small ? cur->next : cur;
     59         if(NULL == tail)
     60             head = small;
     61         else
     62             tail->next = small;
     63         tail = small;
     64     }
     65     return head;
     66 }
     67 
     68 //打印链表
     69 void printList(Node *head)
     70 {
     71     while(NULL != head)
     72     {
     73         cout << head->value << " ";
     74         head = head->next;
     75     }
     76     cout << endl;
     77 }
     78 
     79 int main()
     80 {
     81     Node *head = NULL;
     82     Node *ptr = NULL;
     83     
     84     for(int i =8;i>0;i--)//构造链表
     85     {
     86         if(NULL == head)
     87         {    
     88             head = new Node(i);
     89             ptr = head;
     90             continue;
     91         }
     92         ptr->next = new Node(i);
     93         ptr = ptr->next;    
     94     }
     95     cout << "Before sorted:" << endl;
     96     printList(head);
     97     cout << "After sorted:" << endl;
     98     head = selectionSort(head);
     99     printList(head);
    100     return 0;
    101 }
    View Code

    注:

      转载请注明出处;

      转载请注明源思路来自于左程云老师的《程序员代码面试指南》。

  • 相关阅读:
    【原】使用Spring自带的JdbcTemplate。
    【原】MyBatis执行DDL:create table,drop table等等
    【转】java获取当前路径的几种方法
    【原】Java程序调用远程Shell脚本
    [转载] 使用Kettle进行数据迁移(ETL)
    appium原理
    python之global关键字的用法
    python之selenium定位(xpath)
    android 稳定性monkey测试
    python之selenium随记(几种等待的用法)
  • 原文地址:https://www.cnblogs.com/PrimeLife/p/5440463.html
Copyright © 2011-2022 走看看