क्या सी मानक पुस्तकालय में किसी भी प्रकार का पुस्तकालय कार्य उपलब्ध है?
क्या सी मानक पुस्तकालय में किसी भी प्रकार का पुस्तकालय कार्य उपलब्ध है?
जवाबों:
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;
}
return (f > s) - (f < s);
qsort
फंक्शन "प्वाइंट 4" यदि दो तत्व समान रूप से तुलना करते हैं, तो परिणामी सॉर्ट किए गए सरणी में उनका क्रम अनिर्दिष्ट है। "
C / C ++ मानक लाइब्रेरी <stdlib.h>
में qsort
फ़ंक्शन होता है।
यह दुनिया में सबसे अच्छा त्वरित कार्यान्वयन नहीं है, लेकिन यह पर्याप्त रूप से तेज़ है और बहुत आसान है ... उपयोग करने की औपचारिक वाक्य रचना है:
qsort(<arrayname>,<size>,sizeof(<elementsize>),compare_function);
केवल एक चीज जिसे आपको कार्यान्वित करने की आवश्यकता है, वह है तुलना_फंक्शन, जो "कॉन्स्टेबल शून्य" प्रकार के दो तर्कों में लेता है, जिन्हें उपयुक्त डेटा संरचना में डाला जा सकता है, और फिर इन तीन मूल्यों में से एक को वापस कर सकते हैं:
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;
}
int
को छाँटते हैं, तो तुलनित्र को दिए गए मान दोनों int *
के रूप में प्रच्छन्न होते हैं void *
। जब किसी सरणी को छाँटते हैं char *
, इसलिए, तुलनित्र को दिए गए मान दोनों ही char **
प्रच्छन्न होते हैं void *
। इसलिए, सही कोड होना चाहिए int compare_function(const void *a,const void *b) { return (strcmp(*(char **)a, *(char **)b)); }
:।
if (x > y) return +1; else if (x < y) return -1; else return 0;
, या यदि आप एक सरल अभिव्यक्ति चाहते हैं, तो return (x > y) - (x < y);
। यह हमेशा सी स्तर पर दो तुलनाओं का मूल्यांकन करता है, लेकिन आशावादी इससे बचने में सक्षम हो सकता है। घटाव अहस्ताक्षरित मूल्यों पर काम नहीं करता है। पहला संस्करण तब अच्छी तरह से काम करता है जब आप तुलना की एक श्रृंखला के साथ काम कर रहे हैं - पहले एक संरचना के 2 पूर्णांक के सदस्यों की तुलना करना, और यदि वे बराबर हैं, तो दो डबल्स, फिर दो स्ट्रिंग्स, आदि ऐसा करने का एक से अधिक तरीका है, सी में और साथ ही पर्ल।
यकीन के लिए: qsort()
एक प्रकार का कार्यान्वयन है (जरूरी नहीं कि यह अपने नाम के अनुसार सुझाव दे सकता है)।
आदमी 3 qsort आज़माएं या http://linux.die.net/man/3/qsort पर पढ़ें
qsort
Quicksort का उपयोग करके लागू नहीं किया जाना चाहिए।
हालांकि मानक पुस्तकालय में बिल्कुल नहीं है, 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 कंपाइलर में काम करना चाहिए।
qsort
stdlib.h में प्रयास करें ।
का प्रयोग करें qsort()
में <stdlib.h>
।
@paxdiablo यह qsort()
फ़ंक्शन ISO / IEC 9899: 1990 (`` ISO C90 '') के अनुरूप है।
में कई C छँटाई कार्य उपलब्ध हैं stdlib.h
। आप man 3 qsort
उनकी सूची प्राप्त करने के लिए एक यूनिक्स मशीन पर कर सकते हैं, लेकिन वे शामिल हैं: