सी लाइब्रेरी प्रकार प्रदर्शन करने के लिए


98

क्या सी मानक पुस्तकालय में किसी भी प्रकार का पुस्तकालय कार्य उपलब्ध है?


21
@Alexandru, SO का संपूर्ण बिंदु किसी भी कौशल स्तर के सभी प्रोग्रामिंग-संबंधित प्रश्न के लिए एक जगह है। आपको क्या लगता है कि Google को आपके द्वारा उस क्वेरी का उपयोग करने पर लोगों को निर्देशित करना चाहिए? जो शक्तियां चाहती हैं कि वे यहां आएं - जब एसओ उस क्वेरी के लिए शीर्ष Google लिंक हो, तो हमारा काम हो जाए।
पैक्साडैब्लो

1
मेरा मूल कोड आलसी था और शायद अलग-अलग था तो आपको Google खोज के साथ क्या मिला होगा। हालाँकि सामुदायिक इनपुट के बाद आपके पास qsort का उपयोग करने के अच्छे कार्यान्वयन का एक उदाहरण है।
फिर से शुरू

@paxdiablo: अगर ऐसा है, तो वे मानक मानक दस्तावेज़ीकरण की मेजबानी कर सकते हैं - मुझे संदेह है कि यह प्रश्न उस विहित संदर्भ के ऊपर कुछ भी जोड़ देगा, यहाँ। कुछ जटिल मामलों के लिए, शायद - लेकिन सिर्फ एक मूल कार्य खोजने के लिए?
Eamon Nerbonne

4
यहां तक ​​कि इस तरह के सवाल एसओ की अंतिम पूर्णता में योगदान करते हैं, जो अटक कोडर्स के लिए एक सहायक डेटाबेस के रूप में है।
छोटाग्रि

7
इसके अलावा कई मामलों में लोगों को पता नहीं है कि क्या खोजना है। यदि आप जानते हैं कि c का एक प्रकार्य फ़ंक्शन है जिसका नाम qsort () दस्तावेज़ीकरण आसानी से उपलब्ध है, हालाँकि यदि आप नहीं जानते कि किसी संसाधन का क्या उपयोग करना चाहिए।
रियून

जवाबों:


120

qsort()वह फ़ंक्शन है जिसे आप खोज रहे हैं। आप इसे अपने डेटा के सरणी, उस सरणी में तत्वों की संख्या, प्रत्येक तत्व के आकार और तुलनात्मक फ़ंक्शन के लिए एक सूचक के साथ कहते हैं।

यह अपना जादू करता है और आपकी सरणी को जगह में क्रमबद्ध किया जाता है। एक उदाहरण इस प्रकार है:

#include <stdio.h>
#include <stdlib.h>
int comp (const void * elem1, const void * elem2) 
{
    int f = *((int*)elem1);
    int s = *((int*)elem2);
    if (f > s) return  1;
    if (f < s) return -1;
    return 0;
}
int main(int argc, char* argv[]) 
{
    int x[] = {4,5,2,3,1,0,9,8,6,7};

    qsort (x, sizeof(x)/sizeof(*x), sizeof(*x), comp);

    for (int i = 0 ; i < 10 ; i++)
        printf ("%d ", x[i]);

    return 0;
}

3
यदि आप कभी भी भविष्य में प्रकार बदलते हैं, लेकिन नमूना प्रदान करने के लिए +1 में साइज़ोफ़ (* x) का उपयोग करना चाहिए।
पैक्सिडाब्लो

12
सामान्य स्थिति में, एक को दूसरे से घटाकर चींटियों की तुलना करने का प्रयास अतिप्रवाह होगा। शुरुआत से ही उस बुरी आदत से दूर रहना बेहतर है। उपयोगreturn (f > s) - (f < s);
AnT

4
ठीक है, अधिकांश सुझावों के अनुसार बदल दिया गया। मैं रेखा खींचता हूं, @ChrisL, जरूरत पर size_t क्योंकि मेरे सरणियों को कभी भी बड़ा नहीं मिलता है :-) और, @AndreyT, हालांकि वह हैक है, मैं अपने कोड को पढ़ने योग्य होना पसंद करता हूं :-)
paxdiablo

2
@paxdiablo: यह "हैक" एक अच्छी तरह से स्थापित मुहावरा है। अपने नमक के लायक कोई भी प्रोग्रामर इसे तुरंत पहचान लेता है। पठनीयता पर इसका कोई नकारात्मक प्रभाव नहीं है।
एनटी

2
@Jamish ISO C99 Standard N1256, "7.20.5.2 में" qsortफंक्शन "प्वाइंट 4" यदि दो तत्व समान रूप से तुलना करते हैं, तो परिणामी सॉर्ट किए गए सरणी में उनका क्रम अनिर्दिष्ट है। "
12431234123412341234123

61

C / C ++ मानक लाइब्रेरी <stdlib.h>में qsortफ़ंक्शन होता है।

यह दुनिया में सबसे अच्छा त्वरित कार्यान्वयन नहीं है, लेकिन यह पर्याप्त रूप से तेज़ है और बहुत आसान है ... उपयोग करने की औपचारिक वाक्य रचना है:

qsort(<arrayname>,<size>,sizeof(<elementsize>),compare_function);

केवल एक चीज जिसे आपको कार्यान्वित करने की आवश्यकता है, वह है तुलना_फंक्शन, जो "कॉन्स्टेबल शून्य" प्रकार के दो तर्कों में लेता है, जिन्हें उपयुक्त डेटा संरचना में डाला जा सकता है, और फिर इन तीन मूल्यों में से एक को वापस कर सकते हैं:

  • नकारात्मक, यदि बी से पहले होना चाहिए
  • 0, यदि बराबर बी
  • सकारात्मक, यदि बी के बाद होना चाहिए

1. पूर्णांकों की सूची की तुलना :

बस अगर पूर्णांकों के लिए ए और बी डाली x < y, x-yनकारात्मक, है x == y, x-y = 0, x > y, x-yसकारात्मक है x-yएक शॉर्टकट तरीके से करना यह :) रिवर्स है *x - *yको *y - *xकम करने में छँटाई के लिए / उलटे क्रम

int compare_function(const void *a,const void *b) {
int *x = (int *) a;
int *y = (int *) b;
return *x - *y;
}

2. तार की एक सूची की तुलना :

स्ट्रिंग की तुलना के लिए, आपको लिब के strcmpअंदर फ़ंक्शन की आवश्यकता है <string.h>strcmpडिफ़ॉल्ट रूप से होगा -ve, 0, ve उचित रूप से ... रिवर्स ऑर्डर में सॉर्ट करने के लिए, स्ट्रैम्प द्वारा लौटाए गए साइन को उल्टा करें

#include <string.h>
int compare_function(const void *a,const void *b) {
return (strcmp((char *)a,(char *)b));
}

3. फ्लोटिंग पॉइंट संख्याओं की तुलना :

int compare_function(const void *a,const void *b) {
double *x = (double *) a;
double *y = (double *) b;
// return *x - *y; // this is WRONG...
if (*x < *y) return -1;
else if (*x > *y) return 1; return 0;
}

4. एक कुंजी के आधार पर रिकॉर्ड की तुलना :

कभी-कभी आपको अधिक जटिल सामान को सॉर्ट करने की आवश्यकता होती है, जैसे रिकॉर्ड। यहां qsortपुस्तकालय का उपयोग करने का सबसे सरल तरीका है ।

typedef struct {
int key;
double value;
} the_record;

int compare_function(const void *a,const void *b) {
the_record *x = (the_record *) a;
the_record *y = (the_record *) b;
return x->key - y->key;
}

2
एक बहुत अच्छा जवाब है, लेकिन तुलना समारोह की वापसी मूल्य की व्याख्या पीछे की ओर है। इसके अलावा, कुछ उदाहरणों में, आप xy चाल कर रहे हैं, जो दोषपूर्ण परिणाम दे सकता है (और एक साधारण तुलना की तुलना में कम स्पष्ट है)।
एड्रियन मैक्कार्थी

खैर, जहां तक ​​मेरा सवाल है .. यह हर प्रतियोगिता के लिए काम करता है;)
whacko__Cracko

5
यदि x और y के बीच का अंतर सबसे बड़े अभ्यावेदन int से अधिक है तो xy ट्रिक काम नहीं करता है। इसलिए दो सकारात्मक संख्याओं की तुलना करते समय यह ठीक है, लेकिन तुलना करना विफल रहेगा, जैसे, INT_MAX और -10। अपवित्र हालांकि मुझे बहुत अलग-अलग प्रकारों को छांटने के सभी उदाहरण पसंद हैं।
डगलस

2
साथ ही पूर्णांक तुलनित्र और प्रमुख तुलनित्र दोनों कार्यों में अतिप्रवाह की समस्या है, स्ट्रिंग तुलना फ़ंक्शन गलत है। जब किसी सरणी intको छाँटते हैं, तो तुलनित्र को दिए गए मान दोनों int *के रूप में प्रच्छन्न होते हैं void *। जब किसी सरणी को छाँटते हैं char *, इसलिए, तुलनित्र को दिए गए मान दोनों ही char **प्रच्छन्न होते हैं void *। इसलिए, सही कोड होना चाहिए int compare_function(const void *a,const void *b) { return (strcmp(*(char **)a, *(char **)b)); }:।
जोनाथन लेफ़लर

1
पूर्णांक प्रतिरोधी के लिए जो अतिप्रवाह प्रतिरोधी हैं, विचार करें if (x > y) return +1; else if (x < y) return -1; else return 0;, या यदि आप एक सरल अभिव्यक्ति चाहते हैं, तो return (x > y) - (x < y);। यह हमेशा सी स्तर पर दो तुलनाओं का मूल्यांकन करता है, लेकिन आशावादी इससे बचने में सक्षम हो सकता है। घटाव अहस्ताक्षरित मूल्यों पर काम नहीं करता है। पहला संस्करण तब अच्छी तरह से काम करता है जब आप तुलना की एक श्रृंखला के साथ काम कर रहे हैं - पहले एक संरचना के 2 पूर्णांक के सदस्यों की तुलना करना, और यदि वे बराबर हैं, तो दो डबल्स, फिर दो स्ट्रिंग्स, आदि ऐसा करने का एक से अधिक तरीका है, सी में और साथ ही पर्ल।
जोनाथन लेफ़लर

9

यकीन के लिए: qsort()एक प्रकार का कार्यान्वयन है (जरूरी नहीं कि यह अपने नाम के अनुसार सुझाव दे सकता है)।

आदमी 3 qsort आज़माएं या http://linux.die.net/man/3/qsort पर पढ़ें


7
qsortQuicksort का उपयोग करके लागू नहीं किया जाना चाहिए।
जेम्स मैकनेलिस

6

हालांकि मानक पुस्तकालय में बिल्कुल नहीं है, https://github.com/swenson/sort में सिर्फ दो हेडर फाइलें हैं, जिन्हें आप अविश्वसनीय रूप से तेजी से छंटने वाले मार्ग की एक विस्तृत श्रृंखला तक पहुंच प्राप्त करने के लिए शामिल कर सकते हैं, जैसे:

#define SORT_NAME int64 #define SORT_TYPE int64_t #define SORT_CMP ( x , y ) (( x ) - ( y )) #include "sort.h" / * अब आपके पास int64_quick_sort, int64_tim_sort, आदि की पहुंच है, जैसे *। 
int64_quick_sort ( आगमन , 128 ); / * मान लें कि आपके पास कुछ int * arrest या int arrest [128] है; * /

   
 
  

यह मानक लाइब्रेरी की तुलना में कम से कम दो बार तेज़ होना चाहिए qsort, क्योंकि यह फ़ंक्शन पॉइंटर्स का उपयोग नहीं करता है, और इसमें चुनने के लिए कई अन्य सॉर्टिंग एल्गोरिदम विकल्प हैं।

यह C89 में है, इसलिए मूल रूप से हर C कंपाइलर में काम करना चाहिए।




3

में कई C छँटाई कार्य उपलब्ध हैं stdlib.h। आप man 3 qsortउनकी सूची प्राप्त करने के लिए एक यूनिक्स मशीन पर कर सकते हैं, लेकिन वे शामिल हैं:

  • ढेर बनाएं और छांटें
  • जल्दी से सुलझाएं
  • मर्ज़ सॉर्ट

7
हीप्सॉर्ट और मर्जर्ट मानक में नहीं हैं।
टेक्नोविज़

3
न तो जल्दी है। मानक जनादेश का उपयोग नहीं करता है।
पैक्सिडाब्लो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.