/*memcpy*/23#de" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

qsort--random_shuffle

系統 1605 0

1,實現random_shuffle:random_shuffle是STL中的一個模板算法,作用是隨機重排列一對random access iterator之間的元素。基本思想是:假設序列有n個元素,先從所有元素中選一個放到位置1(即與位置1的元素交換),然后再從剩下的n-1個元素中選擇一個放到位置2,以此類推。

2,qsort:partition之后雙向遞歸。

qsort的實現:

View Code
        
           1
        
        
          #include 
        
        
          <
        
        
          string
        
        
          .h
        
        
          >
        
        
        
        
          /*
        
        
           memcpy 
        
        
          */
        
        
          
2
3 #define SWAP_ELEM(pl, pr, size) do {\
4 char temp[size]; /* C99 */ \
5 memcpy(temp, pl, size); \
6 memcpy(pl, pr, size); \
7 memcpy(pr, temp, size); \
8 } while ( 0 )
9
10 char * partition( char * pl, char * pr, size_t size, int pivot_index,
11 int ( * compare_func)( const void * , const void * ))
12 {
13 char * pivot;
14 char * next_less; // pointer to the next slot for elements
15 // with value less than the pivot.
16
17 // 1, swap the pivot element to the last slot.
18 pivot = pl + size * pivot_index;
19 SWAP_ELEM(pr, pivot, size);
20 pivot = pr;
21 // 2, move elements with value less than pivot to the front of the sequence.
22 next_less = pl;
23 while (pl < pr) {
24 if (compare_func(pl, pivot) < 0 ) {
25 SWAP_ELEM(pl, next_less, size);
26 next_less += size;
27 }
28 pl += size;
29 }
30 // 3, swap the pivot to its place
31 SWAP_ELEM(next_less, pivot, size);
32 return next_less;
33 }
34
35 void do_my_qsort( char * pl, char * pr, size_t size,
36 int ( * compare_func)( const void * , const void * ))
37 {
38 if (pr <= pl) { // 0 or 1 element
39 return ;
40 }
41
42 if (pr - pl == size) { // 2 elements
43 if (compare_func(pl, pr) > 0 )
44 SWAP_ELEM(pl, pr, size);
45 return ;
46 }
47
48 // more than 2 elements, divide & conquer.
49 // 1, partition the sequence, pivot is chosen to be the leftmost element.
50 char * new_pivot = partition(pl, pr, size, 0 , compare_func);
51 // 2, recursively enter two subsequences.
52 do_my_qsort(pl, new_pivot - size, size, compare_func);
53 do_my_qsort(new_pivot + size, pr, size, compare_func);
54 }
55
56 /* Implementation of libc-qsort. */
57 void my_qsort( void * base , size_t nmemb, size_t size,
58 int ( * compare_func)( const void * , const void * ))
59 {
60 char * pbase = base ;
61 char * plast = base + nmemb * size - size; // start addr of the last element.
62
63 do_my_qsort(pbase, plast, size, compare_func);
64 }
65
66 #undef SWAP_ELEM

qsort的測試:

View Code
        
            1
        
        
          #include 
        
        
          <
        
        
          stdio.h
        
        
          >
        
        
          
2 #include < stdlib.h >
3 #include < string .h >
4 #include < time.h >
5 #include < assert.h >
6
7 void my_qsort( void * base , size_t nmemb, size_t size,
8 int ( * compare_func)( const void * , const void * ));
9
10 #define MAX_N 27
11 int arr[MAX_N];
12
13 void print_arr( void )
14 {
15 int i;
16
17 for (i = 0 ; i < MAX_N; i ++ )
18 printf( " %d " , arr[i]);
19 printf( " \n " );
20 }
21
22 /* A simplified version of the STL algorithm random_shuffle */
23 void my_random_shuffle( int * arr, int n)
24 {
25 int i;
26
27 srand(time( 0 ));
28 for (i = 1 ; i < n; i ++ ) {
29 int selected_index = rand() % (i + 1 ); // OK, forgive my using rand(),
30 // which is of limited random digits.
31 int temp = arr[selected_index]; // swap to current position.
32 arr[selected_index] = arr[i];
33 arr[i] = temp;
34 }
35 /* equivalent to:
36 for (i = n - 1; i > 0; i--) {
37 int selected_index = rand() % (i + 1); // select a random element.
38 int temp = arr[selected_index]; // swap to current position.
39 arr[selected_index] = arr[i];
40 arr[i] = temp;
41 }
42 */
43 }
44
45 int comp( const void * lhs, const void * rhs)
46 {
47 return * ( int * )lhs - * ( int * )rhs;
48 }
49
50 int main( int argc, char * argv[])
51 {
52 int i;
53
54 for (i = 0 ; i < MAX_N; i ++ )
55 arr[i] = MAX_N - 1 - i;
56 // case #1, sequence of 1 element
57 printf( " case #1: \n " );
58 my_qsort(arr, 1 , sizeof (arr[ 0 ]), comp);
59 print_arr();
60 // case #2, sequence of 2 elements
61 printf( " case #2: \n " );
62 my_qsort(arr, 2 , sizeof (arr[ 0 ]), comp);
63 print_arr();
64 // case #3, sequence of 3 elements
65 printf( " case #3: \n " );
66 my_qsort(arr, 3 , sizeof (arr[ 0 ]), comp);
67 print_arr();
68
69 // case #4, all 0's
70 printf( " case #4: \n " );
71 for (i = 0 ; i < MAX_N; i ++ )
72 arr[i] = 0 ;
73 my_qsort(arr, MAX_N, sizeof (arr[ 0 ]), comp);
74 print_arr();
75
76 // case #5, ascent sequence.
77 printf( " case #5: \n " );
78 for (i = 0 ; i < MAX_N; i ++ )
79 arr[i] = i;
80 my_qsort(arr, MAX_N, sizeof (arr[ 0 ]), comp);
81 print_arr();
82
83 // case #6, descent sequence.
84 printf( " case #6: \n " );
85 for (i = 0 ; i < MAX_N; i ++ )
86 arr[i] = MAX_N - 1 - i;
87 my_qsort(arr, MAX_N, sizeof (arr[ 0 ]), comp);
88 print_arr();
89
90 // case #7, random permutated sequence.
91 printf( " case #7: \n " );
92 for (i = 0 ; i < MAX_N; i ++ )
93 arr[i] = i;
94 my_random_shuffle(arr, MAX_N);
95 print_arr();
96 // qsort(arr, MAX_N, sizeof(arr[0]), comp);
97 // print_arr();
98 my_qsort(arr, MAX_N, sizeof (arr[ 0 ]), comp);
99 print_arr();
100
101 return 0 ;
102 }

qsort--random_shuffle


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 老子影院午夜理伦手机不卡 | 在线看片91 | 欧美洲精品亚洲精品中文字幕 | 亚洲综合在线成人一区 | 成人免费观看www视频 | 久久福利网 | 国产成人在线视频 | 久久伊伊香蕉综合精品 | 黄视频网站免费看 | 日本成a人免费视频 | 伊人色综合久久天天网蜜月 | 久久久网站 | 国产精品久久久久亚洲 | 国产性大片黄在线观看在线放 | 欧美激情第一区 | 亚洲精品国产成人专区 | 一级高清在线观看影片 | 亚洲在线免费观看 | 久久国产精品国产精品 | 国产精品亚洲欧美一级久久精品 | 久久中文亚洲国产 | 天天射天天爱天天干 | 91福利国产在线观看 | 国产精品偷伦视频免费观看的 | 欧美乱大交xxxxx在线观看 | 亚洲欧洲精品视频在线观看 | 久久亚洲伊人中字综合精品 | 亚洲一区二区三区播放在线 | 国产精品v欧美精品∨日韩 国产精品v一区二区三区 | 国产成人性毛片 | 国产亚洲一区二区三区 | 日本不卡一| 最新四虎4hu影库地址在线 | 最近中文日本字幕免费完整 | 五月婷婷六月激情 | 欧美一级黄色毛片 | 日韩在线成人 | 久久久久久亚洲精品中文字幕 | 久久国产精品老人性 | 四虎国产精品免费五月天 | 国内精品久久久久久中文字幕 |