সি স্ট্যান্ডার্ড লাইব্রেরিতে বাছাই করতে কোনও লাইব্রেরি ফাংশন রয়েছে কি?
সি স্ট্যান্ডার্ড লাইব্রেরিতে বাছাই করতে কোনও লাইব্রেরি ফাংশন রয়েছে কি?
উত্তর:
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" ফাংশনটি যদি দুটি উপাদান সমান হিসাবে তুলনা করে, ফলাফল অনুসারে বাছাই করা অ্যারেতে তাদের ক্রমটি অনির্ধারিত। "
সি / সি ++ স্ট্যান্ডার্ড লাইব্রেরিতে ফাংশন <stdlib.h>
রয়েছে qsort
।
এটি বিশ্বের সেরা দ্রুত সাজানোর বাস্তবায়ন নয় তবে এটি যথেষ্ট দ্রুত এবং ব্যবহার করা খুব সহজ ... কিউসোর্টের আনুষ্ঠানিক বাক্য গঠনটি হ'ল:
qsort(<arrayname>,<size>,sizeof(<elementsize>),compare_function);
আপনার কেবলমাত্র যা প্রয়োগ করতে হবে তা হল তুলনা_ফানশন, যা "কনস্ট বেড" টাইপের দুটি যুক্তি গ্রহণ করে, যা যথাযথ ডেটা কাঠামোতে ফেলে দেওয়া যেতে পারে এবং তারপরে এই তিনটি মানের মধ্যে একটি ফিরিয়ে আনতে পারে:
1. পূর্ণসংখ্যার একটি তালিকার তুলনা :
সহজেই পূর্ণসংখ্যায় a এবং b নিক্ষেপ করুন 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. স্ট্রিংগুলির একটি তালিকার তুলনা :
স্ট্রিং তুলনা করার জন্য, আপনার lib strcmp
ভিতরে ফাংশন প্রয়োজন <string.h>
।
strcmp
ডিফল্টরূপে ফিরে আসবে, 0, যথাযথভাবে ... বিপরীত ক্রমে সাজানোর জন্য, কেবল স্ট্রাইক দ্বারা ফিরে আসা চিহ্নটি বিপরীত করুন
#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;
}
৪. একটি কী এর উপর ভিত্তি করে রেকর্ডের তুলনা করা :
কখনও কখনও আপনাকে আরও জটিল স্টাফগুলি যেমন রেকর্ড হিসাবে বাছাই করতে হবে। 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 কিউসোর্ট চেষ্টা করে দেখুন বা http://linux.die.net/man/3/qsort এ পড়ুন
qsort
কুইকসোর্ট ব্যবহার করে প্রয়োগ করতে হবে না।
ঠিক স্ট্যান্ডার্ড লাইব্রেরিতে না থাকাকালীন, https://github.com/swenson/sort এর মাত্র দুটি হেডার ফাইল রয়েছে যাতে আপনি বিস্ময়করভাবে দ্রুত বাছাই করার রাউটের বিস্তৃত পরিসরে অ্যাক্সেস পেতে অন্তর্ভুক্ত করতে পারেন:
# নির্ধারিত SORT_NAME int64 # নির্ধারণ SORT_TYPE int64_t # নির্ধারিত SORT_CMP (x, y) ((x) - (y)) # অন্তর্ভুক্ত / * আপনার এখন int64_quick_sort, int64_tim_sort ইত্যাদির অ্যাক্সেস রয়েছে, যেমন, * / int64_quick_sort (আরআর, 128); / * ধরে নিন আপনার কিছুটা ইনআর * বা আরআর রয়েছে [128]; * /
এটি স্ট্যান্ডার্ড লাইব্রেরির চেয়ে কমপক্ষে দ্বিগুণ দ্রুত হওয়া উচিত qsort
কারণ এটি ফাংশন পয়েন্টার ব্যবহার করে না এবং এর মধ্যে আরও অনেকগুলি বাছাইকরণ অ্যালগরিদম বিকল্প রয়েছে।
এটি সি 89 এ রয়েছে, সুতরাং প্রতিটি সি সংকলকটি মূলত কাজ করা উচিত।
qsort
stdlib.h এ চেষ্টা করুন ।
ব্যবহার করুন qsort()
মধ্যে <stdlib.h>
।
@paxdiablo qsort()
আইএসও / আইইসি 9899 ফাংশন কনর্ফাম করে 1990 ( `` আইএসও C90 '')।
এখানে বেশ কয়েকটি সি বাছাইয়ের ফাংশন পাওয়া যায় stdlib.h
। আপনি man 3 qsort
একটি ইউনিক্স মেশিনে তাদের একটি তালিকা পেতে পারেন তবে সেগুলির মধ্যে রয়েছে: