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

清風竹林

ぷ雪飄絳梅映殘紅
   ぷ花舞霜飛映蒼松
     ----- Do more,suffer less

冒泡和選擇排序該被踢出教材了(轉)

文章源于csdn的一篇帖子,原地址:http://topic.csdn.net/u/20100805/20/231B9356-847D-4FE9-87BA-2A2A3C55CA76.html

非常汗顏,樓主所提到的一些方法,像鴿巢排序與梳排序的名字我都沒聽說過,故摘抄至此,共勉之!

--------------------------------------------------------------------------------------
實用排序算法(復雜度小于等于O(n^2))中效率最低但實現并不是最簡單的的兩個,C、C++教材卻總喜歡拿來大講特講,非常不利于初學者養成“程序效率”的思維。

實際上,各種排序算法里,除了堆排序實現較為復雜外,從代碼量的角度,大多數算法都不比冒泡、選擇算法復雜多少。

舉幾個高速的排序算法的例子,這些才適合進入教材

鴿巢排序,排序字節串、寬字節串最快的排序算法,計數排序的變種(將計數緩沖區大小固定,少一次遍歷開銷),速度是STL中std::sort的20多倍,更重要的是實現極其簡單!缺點是需要一個size至少等于待排序數組取值范圍的緩沖區,不適合int等大范圍數據
C/C++ code
void PigeonholeSort(BYTE *array, int length) { int b[256] = {0}; int i,k,j = 0; for(i=0; i<length; i++) b[array[i]]++; for(i=0; i<256; i++) for(k=0; k<b[i]; k++) array[j++] = i; }



多一次遍歷的計數排序,排序字節串的話速度約是鴿巢排序的一半
C/C++ code
void CountingSort(BYTE *array, int length) { int t; int i, z = 0; BYTE min,max; int *count; min = max = array[0]; for(i=0; i<length; i++) { if(array[i] < min) min = array[i]; else if(array[i] > max) max = array[i]; } count = (int*)malloc((max-min+1)*sizeof(int)); for(i=0; i<max-min+1; i++) count[i] = 0; for(i = 0; i < length; i++) count[array[i]-min]++; for(t = 0; t <= 255; t++) for(i = 0; i < count[t-min]; i++) array[z++] = (BYTE)t; free(count); }


快速排序,快排最標準的遞歸實現,速度約是std::sort的一半
C/C++ code
void swap(BYTE *a,BYTE *b) { BYTE tmp; if ( a != b ) { tmp = *a; *a = *b; *b = tmp; } } int partition(BYTE *arr,int left, int right) { int i = left - 1, j = right; BYTE v = arr[right]; while(1) { while(arr[++i] < v); while(arr[--j] > v) if(j == 1) break; if(i >= j) break; swap(&arr[i],&arr[j]); } swap(&arr[i],&arr[right]); return i; } void quicksort(BYTE *arr, int left, int right) { if (left < right) { int i = partition(arr,left,right); quicksort(arr,left,i-1); quicksort(arr,i+1,right); } } void QuickSort(BYTE *array,int length) { quicksort(array,0,length-1); }


這是速度與std::sort相當的三路劃分快排
C/C++ code
void swap(BYTE *a,BYTE *b) { BYTE tmp; if ( a != b ) { tmp = *a; *a = *b; *b = tmp; } } void quicksort(BYTE *arr, int left, int right) { if (left < right) { BYTE v = arr[right]; int i = left - 1,j = right,p = left - 1,q = right,k=0; while (1) { while (arr[++i] < v); while (arr[--j] > v) if(j==left) break; if (i >= j) break; swap(&arr[i], &arr[j]); if(arr[i] == v) { p++; swap(&arr[p],&arr[i]); } if(arr[j] == v) { q--; swap(&arr[q],&arr[j]); } } swap(&arr[i],&arr[right]); j = i - 1; i++; for(k=left; k<=p; k++,j--) swap(&arr[k],&arr[j]); for(k=right-1; k>=q; k--,i++) swap(&arr[k],&arr[i]); quicksort(arr,left,j); quicksort(arr,i,right); } } void QuickSort(BYTE *array,int length) { quicksort(array,0,length-1); }



相當簡單的梳排序,效率是std::sort的三分之一
C/C++ code
void CombSort(BYTE *arr, int size) { UINT gap = size, swapped = 1, i = 0; BYTE swap = 0; while ((gap > 1) || swapped) { if (gap > 1) gap = gap / 1.3; swapped = 0; i = 0; while ((gap + i) < size) { if (arr[i] - arr[i + gap] > 0) { swap = arr[i]; arr[i] = arr[i + gap]; arr[i + gap] = swap; swapped = 1; } ++i; } } }


LSD基數排序,與std::sort速度相當,但是需要一個與輸入緩沖一樣大的緩沖區
C/C++ code
#define R 256 #define digit(a, d) ( a >> 8*d ) static BYTE *aux; void radix_sort(BYTE *arr, int left, int right) { if(left < right) { int d = 0; for(d=3; d>=0; d--) { int i=0, j=0, count[R+1]; for(j=0; j<R; j++) count[j] = 0; for(i=left; i<=right; i++) count[digit(arr[i],d) + 1]++; for(j=1; j<R; j++) count[j] += count[j-1]; for(i=left; i<=right; i++) aux[count[digit(arr[i],d)]++] = arr[i]; for(i=left; i<=right; i++) arr[i] = aux[i-1]; } } } void RadixSort(BYTE *array,int length) { aux = (BYTE*)malloc(length); radix_sort(array,0,length-1); free(aux); }


歸并排序,效率越是std::sort的六分之一,通常的實現是遞歸,但和快排不同,歸并改循環極其容易
C/C++ code
void merge(BYTE *array, int low, int mid, int high) { int i, k; BYTE *temp = (BYTE *) malloc(high-low+1); int begin1 = low; int end1 = mid; int begin2 = mid + 1; int end2 = high; for (k = 0; begin1 <= end1 && begin2 <= end2; ++k) if(array[begin1]<array[begin2]) temp[k] = array[begin1++]; else temp[k] = array[begin2++]; while(begin1<=end1) temp[k++] = array[begin1++]; while(begin2<=end2) temp[k++] = array[begin2++]; for (i = 0; i < (high-low+1); i++) array[low+i] = temp[i]; free(temp); } void merge_sort(BYTE *array, UINT first, UINT last) { UINT mid,i; for(mid=1; mid<=last-first; mid += mid) for(i=first; i<=last-mid; i+=mid+mid) merge(array,i,i+mid-1,min(i+mid+mid-1,last)); } void MergeSort(BYTE *array, UINT length) { merge_sort(array,0,length-1); }

posted on 2010-11-25 09:59 李現民 閱讀(943) 評論(2)  編輯 收藏 引用 所屬分類: 絕對盜版算法為魂

評論

# re: 冒泡和選擇排序該被踢出教材了(轉) 2010-11-28 01:15 oldman

總結的很好,但對于帖子的名稱,建議改換之,理由如下:

中國的國情是大部分計算機專業的學生是從命令式語言開始學習的,比如C。在命令式語言的范圍內,冒泡和選擇排序是比較好理解的,對于初學者來講是個很好的入門方式。一開始就讓初學者學一些不太淺顯易懂的算法,徒然讓他們對這份領域望而生畏。

還有如果要介紹計數排序和桶排序,最好把基于比較和不是基于比較的系統講解下,這樣有助于學生對排序算法建立宏觀的感性認知。

另外,強烈建議計算機專業開設FP(函數式編程)課程,FP的思想對理解數據結構和算法有很好的幫助  回復  更多評論   

# re: 冒泡和選擇排序該被踢出教材了(轉) 2010-11-28 09:35 李現民

@oldman
對您提出的意見表示感謝
但是, 這文章是轉csdn上的一篇帖子,帖子的地址您可以在文章的最開始處看到,基于尊重原創的想法,我覺得還是不要去修改的好。
再次表示感謝!  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            制服诱惑一区二区| 国产欧美日韩视频一区二区三区 | 亚洲经典在线看| 亚洲高清精品中出| 国产精品白丝av嫩草影院| 亚洲精品久久在线| 99re6热只有精品免费观看| 一区二区三区精品视频| 亚洲精品中文字幕在线观看| 99国产精品久久久久久久| 中文精品视频一区二区在线观看| 正在播放欧美视频| 欧美一区2区三区4区公司二百| 久久久亚洲一区| 亚洲国产精品久久久| 亚洲国产另类久久精品| 亚洲图片在线| 久久夜精品va视频免费观看| 欧美精品七区| 国产在线播放一区二区三区| 亚洲国产中文字幕在线观看| 亚洲一二三区精品| 麻豆av一区二区三区| 亚洲欧洲综合另类在线| 亚洲午夜激情免费视频| 久久亚洲欧美| 国产精品欧美一区二区三区奶水| 1024亚洲| 性一交一乱一区二区洋洋av| 欧美激情精品久久久久| 亚洲欧美欧美一区二区三区| 蜜桃av一区| 国产色综合网| 中文欧美在线视频| 欧美激情亚洲自拍| 欧美一级一区| 欧美性感一类影片在线播放| 1024成人网色www| 欧美在线www| 99亚洲视频| 欧美插天视频在线播放| 国内精品亚洲| 久久国产成人| 一本色道久久综合亚洲91| 嫩草影视亚洲| 好吊色欧美一区二区三区四区| 亚洲欧美激情一区二区| 亚洲片国产一区一级在线观看| 欧美一区二区三区喷汁尤物| 国产精品成人观看视频免费| 亚洲精品婷婷| 欧美大片18| 久久视频一区| 伊人久久大香线| 久久精品一区二区三区中文字幕| 亚洲视频欧美在线| 国产精品福利在线| 亚洲图片欧洲图片av| 亚洲国产免费| 欧美高清视频在线| 亚洲精品视频免费在线观看| 欧美肥婆在线| 欧美激情网友自拍| 另类国产ts人妖高潮视频| 午夜在线精品| 国产亚洲成av人片在线观看桃| 亚洲综合99| 宅男精品导航| 国产精品午夜在线观看| 午夜在线观看免费一区| 亚洲免费伊人电影在线观看av| 国产精品视频网| 欧美伊久线香蕉线新在线| 亚洲欧美文学| 国内精品久久久久久久97牛牛| 久久精品中文字幕一区| 久久精品在线视频| 亚洲国产99精品国自产| 亚洲高清毛片| 国产精品大片wwwwww| 欧美一区二区视频网站| 久久久久久亚洲精品杨幂换脸| 亚洲高清资源| 99re热这里只有精品视频| 国产精品入口夜色视频大尺度| 久久精品视频99| 久久男女视频| 中文成人激情娱乐网| 午夜精品在线视频| 亚洲日本激情| 亚洲午夜女主播在线直播| 国内精品**久久毛片app| 亚洲电影av在线| 国产精品美女主播| 欧美福利在线| 国产精品青草久久| 麻豆av一区二区三区| 欧美日本精品| 可以免费看不卡的av网站| 欧美精品二区三区四区免费看视频| 亚洲在线网站| 久久免费视频网站| 亚洲欧美日韩精品在线| 久久久久久国产精品一区| 亚洲午夜电影| 久久免费99精品久久久久久| 亚洲一区中文字幕在线观看| 久久久夜精品| 亚洲欧美综合精品久久成人| 久热成人在线视频| 亚洲欧美日韩一区在线| 女生裸体视频一区二区三区| 欧美一区二区三区四区在线| 欧美国产日韩一区二区| 久久久久久伊人| 国产精品久久久久国产精品日日| 欧美激情亚洲视频| 国产亚洲激情在线| 亚洲午夜免费福利视频| 一区二区久久| 欧美成人tv| 欧美成人dvd在线视频| 国产一区二区高清不卡| 亚洲一二三区在线观看| 在线视频精品一区| 欧美激情aaaa| 亚洲字幕在线观看| 中国女人久久久| 美女网站久久| 久久精品日韩欧美| 国产精品无人区| 一本色道久久88综合亚洲精品ⅰ | 国产一区二区三区在线观看免费视频 | 久久综合色一综合色88| 欧美中文字幕在线播放| 欧美三区在线| 9i看片成人免费高清| 99精品视频免费观看| 欧美黄色一级视频| 亚洲国产成人精品女人久久久| 在线观看亚洲视频啊啊啊啊| 久久国产主播精品| 老鸭窝亚洲一区二区三区| 在线观看成人小视频| 久久亚洲春色中文字幕久久久| 久久综合伊人77777蜜臀| 精品96久久久久久中文字幕无| 久久久精彩视频| 欧美电影在线观看完整版| 亚洲国产欧美一区二区三区久久 | 久久综合网色—综合色88| 久久久青草青青国产亚洲免观| 国产精品高精视频免费| 亚洲一区三区视频在线观看| 午夜亚洲性色福利视频| 国产女主播一区二区三区| 校园春色国产精品| 免费观看成人| 亚洲伦理中文字幕| 欧美视频三区在线播放| 亚洲欧美日韩中文视频| 麻豆久久精品| 99精品视频免费观看| 国产精品国产a| 欧美中文日韩| 亚洲国产婷婷香蕉久久久久久99| 日韩视频在线观看国产| 国产精品色婷婷| 久久久亚洲人| 一区二区三区国产在线| 久久精品国产亚洲高清剧情介绍| 亚洲国产成人一区| 欧美午夜一区二区| 久久久久久夜精品精品免费| 亚洲精品国产欧美| 久久精品日产第一区二区| 亚洲人成网站777色婷婷| 国产精品国产成人国产三级| 久久人人爽爽爽人久久久| 99国产精品国产精品久久| 欧美成人精品1314www| 久久久999国产| 99综合在线| 国产一区二区三区网站| 欧美另类亚洲| 久久久国产精品一区| 日韩视频免费观看高清完整版| 久久精品欧美日韩| 亚洲作爱视频| 影音先锋国产精品| 国产精品免费一区豆花| 欧美激情中文字幕一区二区 | 欧美成人午夜激情在线| 亚洲欧美国产精品桃花| 亚洲日韩欧美一区二区在线| 久久精品视频网| 午夜精品一区二区三区在线| 亚洲三级国产| 亚洲国产日本| 在线看片一区|