• 跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort)


    跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort)

    选择排序(selection sort)

    算法原理:有一筐苹果,先挑出最大的一个放在最后,然后再跳出一个筐里剩下的最大的一个,放在刚才跳出来的最大的前面,以此类推,最后就排好顺序了。

    代码:

    //从起始于位置p的n个元素中选出最大者,所以n>1
    template<typename T>
    ListNode<T>* List<T>::selectMax(ListNode<T>* p, int n){
    
      ListNode<T>* max = p;
      while(1 < n--){
        if((p = p->succ)->data >= max->data) max = p;
      }
    
      return max;
    }
    
    //对从p开始的连续n个元素做选择排序,n > 1
    template<typename T>
    void List<T>::selectionSort(ListNode<T>* p, int n){
    
      ListNode<T>* head = p->pred;
      ListNode<T>* tail = p;
    
      for(int i = 0; i < n; ++i)  tail = tail->succ;
    
      while(1 < n){
        ListNode<T>* node = selectMax(head->succ, n--);
    
        //调整这个节点的前后节点
        node->pred->succ = node->succ;
        node->succ->pred = node->pred;
    
        //把卸下来的节点加到最后一个元素的前面
        //前进线路
        tail->pred->succ = node;
        node->succ = tail;
        //后退路线
        node->pred = tail->pred;
        tail->pred = node;
    
        tail = node;
      }
    }
    

    插入排序(insertion sort)

    算法原理:打扑克或者打麻将时,每抓一张牌后,会根据手里的牌,把抓来的这张牌,插入到适当的顺序,每抓一张牌,插入一次,全部抓完后,顺序也就排好了。

    代码:

    //在p的前n个前驱中,查找不大于e的最后者
    template<typename T>
    ListNode<T>* List<T>::search(const T& e, int n, ListNode<T>* p){
    
      while(0 < n--){
        if(p->pred->data <= e) return p->pred;
        p = p->pred;
      }
    
      return p;
    }
    
    //对从p开始的连续n个元素做选择排序
    template<typename T>
    void List<T>::insertionSort(ListNode<T>* p, int n){
    
      for(int r = 0; r < n; r++){
        if(r == 0) {
          p = p->succ;
          continue;
        }
        ListNode<T>* node = search(p->data, r, p->pred);
        auto tmp = p->succ;
    
        //删除p节点
        p->pred->succ = p->succ;
        p->succ->pred = p->pred;
    
        //在node节点后面插入p节点
        p->succ = node->succ;//设定p的后驱
        node->succ->pred = p;//设定p的后驱的前驱
    
        node->succ = p;//设定p的前驱的后驱
        p->pred = node;//设定p的前驱
    
        p = tmp;
      }
    }
    

    c/c++ 学习互助QQ群:877684253

    本人微信:xiaoshitou5854

  • 相关阅读:
    GitHub Android Libraries Top 100 简介
    GitHub Top 100 的项目(iOS)
    iOS 学习资源
    HTTP和GET/POST请求(NSURLConnection)
    RunLoop
    HTML5 拖放
    网络安全与加密
    Cocoapods的安装
    iOS中的单例模式
    SDWebImage
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/11697648.html
Copyright © 2020-2023  润新知