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

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>
            久久国产精品第一页| 99re6这里只有精品| 午夜久久资源| 日韩一区二区精品葵司在线| 欧美中文字幕不卡| 欧美成人免费视频| 一本色道久久综合狠狠躁的推荐| 欧美伦理在线观看| 亚洲欧美日韩国产一区二区三区 | 快射av在线播放一区| 久久久久女教师免费一区| 亚洲激精日韩激精欧美精品| 日韩视频免费观看高清完整版| 欧美二区在线播放| 在线亚洲美日韩| 欧美成年人视频网站| 亚洲先锋成人| 伊人色综合久久天天| 欧美精品久久99久久在免费线| 欧美一二三区在线观看| 日韩视频免费大全中文字幕| 国内外成人免费视频| 国产精品理论片在线观看| 一区二区在线观看视频| 欧美成人中文字幕| 久久精品在线视频| 亚洲一区二区综合| 亚洲一区二区三区欧美| 一区二区三区视频在线观看| 亚洲欧洲日本mm| 欧美在线黄色| 伊人婷婷久久| 欧美日韩免费高清| 一本久道综合久久精品| 久久野战av| 亚洲人成欧美中文字幕| 国产日韩欧美二区| 欧美黄色片免费观看| 午夜精品久久久久久久久久久| 亚洲国产老妈| 久久婷婷麻豆| 亚洲欧美日韩在线播放| 亚洲欧美日本伦理| 久久高清福利视频| 性欧美video另类hd性玩具| 亚洲欧洲在线播放| 韩国成人福利片在线播放| 国产精品国产三级国产aⅴ入口 | 亚洲国产高清自拍| 在线观看欧美激情| 欧美激情91| 午夜国产不卡在线观看视频| 国产一区二区三区在线观看视频| 欧美午夜影院| 欧美日韩国产一级| 国产精品初高中精品久久| 欧美日韩一区免费| 国产精品久在线观看| 欧美精品国产一区二区| 欧美激情一区二区| 国产精品毛片在线看| 欧美视频免费在线观看| 蜜臀va亚洲va欧美va天堂| 午夜免费日韩视频| 一区二区三区高清| 性欧美超级视频| 美女91精品| 国产午夜亚洲精品理论片色戒 | 欧美色欧美亚洲另类七区| 欧美手机在线| 国产日本欧美视频| 9人人澡人人爽人人精品| av成人动漫| 久热综合在线亚洲精品| 国产精品国产馆在线真实露脸| 日韩午夜视频在线观看| 亚洲国产精品免费| 亚洲视频在线观看视频| 欧美视频二区36p| 欧美激情女人20p| 亚洲精品在线观看免费| 国产精品视屏| 亚洲精品久久久久久久久久久久| 欧美成人免费全部| 亚洲第一福利视频| 欧美日韩国产成人在线观看| 亚洲精品永久免费| 99亚洲精品| 欧美淫片网站| 新狼窝色av性久久久久久| 欧美成人国产一区二区 | 亚洲二区视频在线| 国产精品美女久久久免费| 99精品欧美一区二区三区综合在线| 欧美日韩视频专区在线播放| 久久成年人视频| 欧美日韩一区二区三区在线| 性8sex亚洲区入口| 亚洲欧美另类综合偷拍| 香蕉av福利精品导航| 久久精品国产第一区二区三区| 久久久精品五月天| 亚洲精品国久久99热| 国产亚洲欧美一区| 久久婷婷麻豆| 欧美中文字幕在线视频| 亚洲成人在线网| 日韩天堂在线视频| 欲色影视综合吧| 亚洲女人天堂av| 亚洲一区二区三区精品在线| 久久久久9999亚洲精品| 亚洲午夜激情| 欧美国产丝袜视频| 欧美在线免费播放| 国产精品二区影院| 裸体一区二区| 国产精品ⅴa在线观看h| 欧美激情久久久久| 国产偷久久久精品专区| 91久久精品国产91久久性色| 久久久精品2019中文字幕神马| 国产精品嫩草99a| 在线成人激情黄色| 欧美黄色小视频| 国产视频亚洲| 在线综合+亚洲+欧美中文字幕| 亚洲国产影院| 免费看亚洲片| 亚洲精品视频在线| 在线成人性视频| 久久成人精品一区二区三区| 久久riav二区三区| 久久久久久久激情视频| 欧美精品色综合| 亚洲国产裸拍裸体视频在线观看乱了中文| 国产亚洲毛片| 久久久人成影片一区二区三区观看| 久久精品免费电影| 在线成人激情黄色| 久久免费国产精品| 欧美激情一区二区三区在线视频观看 | 91久久精品www人人做人人爽| 黄色欧美日韩| 久久人人精品| 亚洲免费电影在线| 亚洲一区在线观看免费观看电影高清| 国产精品影院在线观看| 免费人成网站在线观看欧美高清| 日韩视频免费在线观看| 久久精品成人| 一本色道久久综合亚洲精品不 | 亚洲成色www8888| 欧美 日韩 国产一区二区在线视频 | 午夜精品视频在线观看一区二区| 久久久久久久综合色一本| 伊人伊人伊人久久| 欧美国产精品| 亚洲日本无吗高清不卡| 国产视频一区二区在线观看 | 欧美日韩中国免费专区在线看| 欧美在线网站| 夜夜爽av福利精品导航 | 亚洲电影第三页| 国产精品拍天天在线| 欧美精品亚洲一区二区在线播放| 久久久久久欧美| 久久精品国产第一区二区三区最新章节 | 91久久在线播放| 麻豆91精品| 亚洲视频在线一区| 欧美一区=区| 中文久久乱码一区二区| 国产视频亚洲精品| 欧美日韩一二三四五区| 欧美黄色小视频| 亚洲东热激情| 久久精品日韩欧美| 欧美一区二区日韩一区二区| 亚洲黄页视频免费观看| 国产喷白浆一区二区三区| 欧美激情精品| 欧美极品一区| 欧美好骚综合网| 欧美激情一区二区三区不卡| 久久免费视频在线| 久久久久久伊人| 麻豆精品在线观看| 亚洲第一精品夜夜躁人人爽| 亚洲欧美精品一区| 欧美日韩伊人| 国产精品欧美在线| 国产精品国产三级国产专播精品人| 亚洲电影免费观看高清完整版在线观看 | 日韩亚洲综合在线| 小黄鸭精品密入口导航| 欧美午夜片在线观看| 国产午夜久久久久| 亚洲第一区在线观看| 亚洲美女黄色|