Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

सी ++ में क्रमबद्ध सूची

मान लीजिए कि हमारे पास एक सूची है, हमें इसे निरंतर अंतरिक्ष जटिलता का उपयोग करके ओ (एन लॉगन) समय में क्रमबद्ध करना है, इसलिए यदि सूची [4,2,1,3] की तरह है, तो यह [1,2,3] होगी 4]

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • क्रमबद्ध, क्रम में दो सूचियों को मर्ज करने के लिए एक विधि को परिभाषित करें, वह विधि मर्ज () है, इसमें दो सूचियां l1 और l2 होती हैं।

  • सॉर्ट सूची विधि नीचे की तरह काम करेगी -

  • यदि सिर शून्य है, या सिर के आगे शून्य है, तो सिर वापस करें

  • धीमा:=सिर, तेज़:=सिर, और पिछला =शून्य

  • जबकि उपवास शून्य नहीं है और उपवास का अगला भी शून्य नहीं है, करें

    • पिछला :=धीमा

    • धीमा :=धीमे के आगे

    • उपवास :=उपवास के अगले के बाद

  • पिछला अगला:=शून्य

  • l1:=सॉर्टलिस्ट (हेड)

  • l2:=सॉर्टलिस्ट (धीमी)

  • वापसी मर्ज(l1, l2)

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

उदाहरण

#include <bits/stdc++.h>
using namespace std;
class ListNode{
   public:
   int val;
   ListNode *next;
   ListNode(int data){
      val = data;
      next = NULL;
   }
};
ListNode *make_list(vector<int> v){
   ListNode *head = new ListNode(v[0]);
   for(int i = 1; i<v.size(); i++){
      ListNode *ptr = head;
      while(ptr->next != NULL){
         ptr = ptr->next;
      }
      ptr->next = new ListNode(v[i]);
   }
   return head;
}
void print_list(ListNode *head){
   ListNode *ptr = head;
   cout << "[";
   while(ptr){
      cout << ptr->val << ", ";
      ptr = ptr->next;
   }
   cout << "]" << endl;
}
class Solution {
   public:
   ListNode* sortList(ListNode* head) {
      if(!head || !head->next)return head;
      ListNode *slow = head, *fast = head, *prev = NULL;
      while(fast && fast->next){
         prev = slow;
         slow = slow->next;
         fast = fast->next->next;
      }
      prev->next = NULL;
      ListNode* l1 = sortList(head);
      ListNode* l2 = sortList(slow);
      return mergeList(l1,l2);
   }
   ListNode* mergeList(ListNode* l1, ListNode* l2){
      ListNode* temp = new ListNode(0);
      ListNode* p =temp;
      while(l1 && l2){
         if(l1->val<=l2->val){
            p->next = l1;
            l1 = l1->next;
         }else{
            p->next = l2;
            l2 = l2->next;
         }
         p = p->next;
      }
      if(l1){
         p->next = l1;
      }
      if(l2){
         p->next = l2;
      }
      return temp->next;
   }
};
main(){
   vector<int> v = {4,2,1,3,5,19,18,6,7};
   ListNode *h1 = make_list(v);
   Solution ob;
   print_list((ob.sortList(h1)));
}

इनपुट

[4,2,1,3,5,9,8,6,7]

आउटपुट

[1, 2, 3, 4, 5, 6, 7, 18, 19, ]

  1. सी क्यूसोर्ट () बनाम सी ++ सॉर्ट ()

    यहां हम देखेंगे कि C में qsort () और C++ में सॉर्ट () में क्या अंतर हैं। सी qsort() फ़ंक्शन प्रदान करता है, जिसका उपयोग किसी सरणी को सॉर्ट करने के लिए किया जा सकता है। फ़ंक्शन तर्क और सिंटैक्स नीचे जैसा है। void qsort(void *base, size_t num, size_t size, int (*comparator) (const void*, const void*)

  1. सी ++ में अगला छोटा तत्व

    अगला छोटा तत्व वह तत्व है जो इसके बाद पहला छोटा तत्व है। आइए एक उदाहरण देखें। गिरफ्तारी =[1, 2, 3, 5, 4] 5 के लिए अगला छोटा तत्व 4 है और तत्वों 1, 2, 3 के लिए अगला छोटा तत्व -1 है क्योंकि उनके बाद कोई छोटा तत्व नहीं है। एल्गोरिदम यादृच्छिक संख्याओं के साथ सरणी प्रारंभ करें स्टैक को इनिशियलाइ

  1. C++ में रैंडम पॉइंटर के साथ कॉपी लिस्ट

    एक लिंक्ड सूची एक रैखिक डेटा संरचना है जिसमें प्रत्येक नोड में दो ब्लॉक होते हैं जैसे कि एक ब्लॉक में नोड का मान या डेटा होता है और दूसरे ब्लॉक में अगले फ़ील्ड का पता होता है। आइए मान लें कि हमारे पास एक लिंक्ड सूची है जैसे कि प्रत्येक नोड में एक यादृच्छिक सूचक होता है जो सूची में अन्य नोड्स को इंग