青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

JonsenElizee

Software Developing Blog

"An idea is fragile . It can be killed by a scornful smile or a yawn .It can be mound down by irony and scared to death by a cold look."
"Most cultures throughout human history have not liked creative individuals .They ignore them or kill them.It is a very efficient way of stopping creativity."

------Advertising boss Charles Browe and Howard Gardner ,professor at Harvard

   :: 首頁 :: 新隨筆 ::  ::  :: 管理 ::

關于快速排序

我們都知道快速排序有很好的O(nlogn),那么更快的快速排序在哪里呢?下面是我的學習記錄。

--By JonsenElizee 2010/09/23

常規的快速排序

學習快速排序,最讓人熟悉的是兩個ptr左右來回指,一次排序后就把一個mid值放在了合適的位置上。這是我一個朋友的非遞歸的C++實現。我改寫一點點,就是加了Crand()來設置數組值,然后編譯運行這個算法,你可能還不能隨隨便便的寫出這個算法,但效果真的很不樂觀,也不知道要運行多久才能排序完26*50的字符串。后面我們會看到一個很精悍的算法。。。

 1 #include <stack>
 2 #include <vector>
 3 #include <iostream>
 4 #include <stdlib.h>
 5 #include <stdio.h>
 6 #include <time.h>
 7 
 8 using namespace std;
 9 
10 typedef struct _record
11 {
12     int begin;
13     int end;
14 }record;
15 
16 void quick_sort(int a[],int len)
17 {
18     vector<record> do_job;
19     record temp;
20     temp.begin = 0;
21     temp.end = len-1;
22     do_job.push_back(temp);
23 
24     while (do_job.size()  != 0) {
25         record temp = do_job.back();
26         do_job.pop_back();
27     
28         int low = temp.begin;
29         int high = temp.end;
30         int key = a[low];
31         while (low < high) {
32             while(low < high && a[high] >= key) high--;
33             a[low] = a[high];
34             while(low < high && a[low] <= key) low++;
35             a[high] = a[low];
36         }
37         a[low] = key;
38 
39         record temp1;
40         temp1.begin = temp.begin;
41         temp1.end = low-1;
42         if (temp1.begin < temp1.end) { do_job.push_back(temp1); }
43 
44         record temp2;
45         temp2.begin = low+1;
46         temp2.end = temp.end;
47         if (temp2.begin < temp2.end) { do_job.push_back(temp2); }
48     }
49 }
50 int main()
51 {
52     int a[26*50];
53     int i = 0;
54     while(i < 26*50) a[i] = rand() % 100;
55     int count =sizeof(a) / sizeof(int);
56     quick_sort(a,count);
57     for (int i = 0; i < count; i++) cout<<a[i]<<endl;
58     return 0;
59 }
60 


更簡更快快速排序

這種快速排序不是最快的,特別是基本有序時會退化到O(n^2),理論上基于比較的排序不會小于O(nlogn),但還是有加速的可能。下面這個是《Programming Pearls 2nd》里面的方法,這個算法真的很精悍,運行完26*50的一個排序,只需要0.09秒,我的實現如下。


運行時是給的一個長度為26*50的一個字符數組,對它進行排序:



更簡更快快速排序++

研究上面算法的執行過程,遵循大師的思路,我改寫了算法,在我的X61Redhat EL5上運行速度比上面的算法快了8倍,也就是運行完26*50長的排序,只需要0.01秒!最后我明白一個道理,要有思想,要有毅力,要有實踐。完稿時,我發現這個算法還有改進的余地。特和大家分享。多多指點。

運行輸入和quick.c中的一樣:

運行結果對比

常規的那個非遞歸的算法從我寫這個文件到現在,它還在運行著。。。

第二個和第三個時間對比如下圖:

(加不加優化-O3都是一樣的結果,在我的X61上,gcc version 4.1.2 20080704 (Red Hat 4.1.2-48))


改進的myquick.c的運行時間是quick.c1/9

最后,我不得不用CtrlC把那個常規的給KILL掉。

Real, User and Sys process time statistics

One of these things is not like the other. Real refers to actual elapsed time; User and Sys refer to CPU time used only by the process.
    *Real is wall clock time - time from start to finish of the call. This is all elapsed time including time slices used by other processes and time the process spends blocked (for example if it is waiting for I/O to complete).
    *User is the amount of CPU time spent in user-mode code (outside the kernel) within the process. This is only actual CPU time used in executing the process. Other processes and time the process spends blocked do not count towards this figure.
    *Sys is the amount of CPU time spent in the kernel within the process. This means executing CPU time spent in system calls within the kernel, as opposed to library code, which is still running in user-space. Like 'user', this is only CPU time used by the process.
      User+Sys will tell you how much actual CPU time your process used.

 

源代碼

核心算法對比圖



quick.c源代碼

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <time.h>
 5 
 6 void quick(char* str, int low, int hig);
 7 void swap(char* a, char* b);
 8 
 9 int main()
10 {
11     char ary[] = //26*50長的字符串數組,內容參考上圖。
12     char* str = ary;
13     printf("calling quick");
14     quick(str, 0, strlen(str)-1);
15     return 0;
16 }
17 
18 void quick(char* str, int low, int hig) {
19     if(low >= hig) return;
20     srand(time(NULL));
21     // get a random key
22     //swap(str + low, str + low + (rand() % (hig - low + 1)));
23     int i = low, j = hig + 1, key = str[low];
24     while(1)
25     {
26         while(++<= hig && str[i] <= key);
27         while(-->= low && str[j] >  key);
28         if(i > j) break// no need to do swap
29         swap(str + i, str + j);
30     }
31     swap(str + low, str + i - 1); // swap key to i-1 position
32     quick(str, low, i - 2);
33     quick(str, i, hig);
34 }
35 
36 void swap(char* a, char* b) {
37     if(a == b) return;
38     *^= *b; *^= *a; *^= *b;
39 }
40 

 

 

myquick.c源代碼

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <time.h>
 5 
 6 void myquick(char* str, int low, int hig);
 7 void swap(char* a, char* b);
 8 
 9 int main()
10 {
11     char ary[] = //26*50長的字符串,同quick.c的輸入。
12     char* str = ary;
13     printf("calling myquick");
14     myquick(str, 0, strlen(str)-1);
15     return 0;
16 }
17 
18 void myquick(char* str, int low, int hig) {
19     if(low >= hig) return;// no need to sort elements
20     // elements in the right of [m] are not sorted
21     int m = low, i = low, j = hig, key = low;
22     // skip any elements that <= [key]
23     while(i <= hig && str[i] <= str[key]) {i++; m++;}
24     // skip elements > [key]
25     while(j >= low && str[j] > str[key]) j--;
26     // initially, i==j is impossible
27     while(i <= j) {
28         // swap small one to m-position
29         if(str[i] <= str[key]) { swap(str + m++, str + i); }
30         i++;
31     }
32     swap(str + low, str + m-1);
33     myquick(str, low, m - 2);
34     myquick(str, m, hig);
35     return;
36 }
37 
38 void swap(char* a, char* b) {
39     if(a == b) return;
40     *^= *b; *^= *a; *^= *b;
41 }
42 




posted on 2010-09-23 15:24 JonsenElizee 閱讀(2815) 評論(0)  編輯 收藏 引用 所屬分類: C.BasicLinux.CLinux.C++

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


By JonsenElizee
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品一区二区三区福利| 亚洲理论电影网| 久久久久久国产精品mv| 亚洲深夜福利| 亚洲中字黄色| 久久久久久久综合日本| 久久综合一区| 欧美日韩精品免费| 国产精品永久免费在线| 国产一区视频在线看| 亚洲第一毛片| 国产精品99久久久久久人| 亚洲无吗在线| 另类尿喷潮videofree | 久久精品一级爱片| 久久躁狠狠躁夜夜爽| 免费日韩成人| 一级日韩一区在线观看| 久久福利一区| 欧美日韩另类综合| 国产综合欧美| 亚洲私人影院在线观看| 久久青草欧美一区二区三区| 亚洲国产精品久久久久婷婷884| 欧美激情免费观看| 亚洲一级免费视频| 免费美女久久99| 国产精品亚洲综合| 亚洲精品乱码久久久久| 久久成人免费| 99天天综合性| 欧美大片91| 激情久久久久久久久久久久久久久久| 洋洋av久久久久久久一区| 久久男人资源视频| 亚洲一区二区三区精品在线| 免费国产一区二区| 含羞草久久爱69一区| 夜夜嗨av一区二区三区| 美女精品一区| 欧美在线播放一区二区| 国产精品美女黄网| 日韩视频永久免费| 免费国产一区二区| 久久福利电影| 国内外成人免费视频| 亚洲性线免费观看视频成熟| 亚洲欧洲综合另类在线| 猛男gaygay欧美视频| 午夜精品视频在线观看一区二区| 欧美高清日韩| 亚洲精品国产日韩| 牛牛国产精品| 久久影院午夜论| 精品成人在线视频| 久久久精品一区| 欧美在线短视频| 国产日韩精品入口| 欧美一区=区| 午夜一区二区三区不卡视频| 欧美体内she精视频| 亚洲系列中文字幕| 99精品欧美一区二区三区| 欧美精品在线播放| 亚洲激情成人网| 久久精品亚洲一区二区三区浴池| 日韩一区二区免费看| 免费一级欧美在线大片| 国模精品一区二区三区| 欧美在线免费观看亚洲| 日韩亚洲欧美一区| 欧美一区二区三区啪啪| 国产真实久久| 亚洲第一搞黄网站| 欧美日韩精品一区| 欧美亚洲系列| 久久久青草婷婷精品综合日韩 | 亚洲精品久久久久久久久久久| 久久婷婷蜜乳一本欲蜜臀| 久久久夜夜夜| 亚洲精品在线免费| 一本色道久久综合亚洲精品婷婷| 久久香蕉精品| 国语自产精品视频在线看| 麻豆成人av| 欧美精品久久一区二区| 亚洲欧美成人一区二区在线电影 | 日韩天堂在线观看| 亚洲一区二区三区视频播放| 国产综合在线看| 亚洲第一中文字幕在线观看| 国产精品jizz在线观看美国| 久久精品人人做人人爽电影蜜月 | 欧美精品videossex性护士| 一区二区三区产品免费精品久久75| 一区二区国产日产| 在线观看精品一区| 亚洲网站在线播放| 亚洲国产精品123| 一本色道久久99精品综合 | 一区二区在线视频播放| 亚洲黄色大片| 国产三级精品三级| 最新国产の精品合集bt伙计| 欧美在线啊v一区| 亚洲精品久久嫩草网站秘色| 性刺激综合网| 99香蕉国产精品偷在线观看| 久久成人18免费观看| 在线一区欧美| 麻豆国产精品777777在线| 午夜一区在线| 欧美三级欧美一级| 亚洲国产精品久久久久| 韩国亚洲精品| 亚洲欧美福利一区二区| 中文av一区特黄| 欧美激情久久久久| 欧美不卡一卡二卡免费版| 国产伪娘ts一区| 亚洲综合色丁香婷婷六月图片| 99视频一区二区| 欧美va天堂va视频va在线| 久久亚洲综合| 好看的av在线不卡观看| 午夜在线不卡| 羞羞色国产精品| 国产精品乱子久久久久| 一级日韩一区在线观看| 亚洲先锋成人| 国产精品久久久久77777| 亚洲六月丁香色婷婷综合久久| 91久久国产精品91久久性色| 久久精品最新地址| 久久视频精品在线| 经典三级久久| 久久视频在线视频| 免费精品视频| 91久久国产综合久久| 欧美成人影音| 亚洲三级色网| 亚洲一级免费视频| 国产精品毛片一区二区三区 | 亚洲国产小视频在线观看| 久久久蜜桃一区二区人| 欧美va天堂va视频va在线| 精品成人国产| 免费观看亚洲视频大全| 亚洲日本va午夜在线电影| 亚洲最新中文字幕| 国产精品日韩欧美一区二区三区| 在线亚洲高清视频| 欧美在线视频在线播放完整版免费观看 | 亚洲一区二区三区在线看 | 亚洲精品免费一二三区| 亚洲精品一二| 欧美系列亚洲系列| 销魂美女一区二区三区视频在线| 久久久久免费| 亚洲精品视频在线看| 欧美视频专区一二在线观看| 亚洲在线日韩| 你懂的成人av| 亚洲一区三区视频在线观看| 国产欧美日韩免费| 老司机一区二区三区| 日韩亚洲一区二区| 国产精品久久婷婷六月丁香| 欧美一区二区三区啪啪| 亚洲第一页在线| 午夜精品久久久久久久男人的天堂| 国产亚洲欧美中文| 欧美激情第1页| 一区二区三区三区在线| 久久久国产精彩视频美女艺术照福利 | 在线亚洲激情| 国产日韩欧美综合一区| 奶水喷射视频一区| 亚洲天堂男人| 亚洲电影专区| 久久精品99国产精品日本| 91久久精品国产91久久性色tv| 国产精品视频免费| 欧美成人综合一区| 亚洲欧美日韩精品久久奇米色影视 | 欧美日韩国产首页| 久久国产加勒比精品无码| 91久久精品美女| 久久一区亚洲| 性做久久久久久| 在线视频日本亚洲性| 国色天香一区二区| 国产精品一级久久久| 欧美日韩第一区| 欧美成年视频| 久久久久国产一区二区三区四区| 亚洲视频精品| 一本一本久久| 亚洲精品免费一区二区三区| 欧美黄色小视频|