• <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>

            清風(fēng)竹林

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

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

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

            非常汗顏,樓主所提到的一些方法,像鴿巢排序與梳排序的名字我都沒(méi)聽(tīng)說(shuō)過(guò),故摘抄至此,共勉之!

            --------------------------------------------------------------------------------------
            實(shí)用排序算法(復(fù)雜度小于等于O(n^2))中效率最低但實(shí)現(xiàn)并不是最簡(jiǎn)單的的兩個(gè),C、C++教材卻總喜歡拿來(lái)大講特講,非常不利于初學(xué)者養(yǎng)成“程序效率”的思維。

            實(shí)際上,各種排序算法里,除了堆排序?qū)崿F(xiàn)較為復(fù)雜外,從代碼量的角度,大多數(shù)算法都不比冒泡、選擇算法復(fù)雜多少。

            舉幾個(gè)高速的排序算法的例子,這些才適合進(jìn)入教材

            鴿巢排序,排序字節(jié)串、寬字節(jié)串最快的排序算法,計(jì)數(shù)排序的變種(將計(jì)數(shù)緩沖區(qū)大小固定,少一次遍歷開(kāi)銷(xiāo)),速度是STL中std::sort的20多倍,更重要的是實(shí)現(xiàn)極其簡(jiǎn)單!缺點(diǎn)是需要一個(gè)size至少等于待排序數(shù)組取值范圍的緩沖區(qū),不適合int等大范圍數(shù)據(jù)
            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; }



            多一次遍歷的計(jì)數(shù)排序,排序字節(jié)串的話速度約是鴿巢排序的一半
            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); }


            快速排序,快排最標(biāo)準(zhǔn)的遞歸實(shí)現(xiàn),速度約是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相當(dāng)?shù)娜穭澐挚炫?/span>
            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); }



            相當(dāng)簡(jiǎn)單的梳排序,效率是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基數(shù)排序,與std::sort速度相當(dāng),但是需要一個(gè)與輸入緩沖一樣大的緩沖區(qū)
            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的六分之一,通常的實(shí)現(xiàn)是遞歸,但和快排不同,歸并改循環(huán)極其容易
            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 李現(xiàn)民 閱讀(907) 評(píng)論(2)  編輯 收藏 引用 所屬分類(lèi): 絕對(duì)盜版算法為魂

            評(píng)論

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

            總結(jié)的很好,但對(duì)于帖子的名稱(chēng),建議改換之,理由如下:

            中國(guó)的國(guó)情是大部分計(jì)算機(jī)專(zhuān)業(yè)的學(xué)生是從命令式語(yǔ)言開(kāi)始學(xué)習(xí)的,比如C。在命令式語(yǔ)言的范圍內(nèi),冒泡和選擇排序是比較好理解的,對(duì)于初學(xué)者來(lái)講是個(gè)很好的入門(mén)方式。一開(kāi)始就讓初學(xué)者學(xué)一些不太淺顯易懂的算法,徒然讓他們對(duì)這份領(lǐng)域望而生畏。

            還有如果要介紹計(jì)數(shù)排序和桶排序,最好把基于比較和不是基于比較的系統(tǒng)講解下,這樣有助于學(xué)生對(duì)排序算法建立宏觀的感性認(rèn)知。

            另外,強(qiáng)烈建議計(jì)算機(jī)專(zhuān)業(yè)開(kāi)設(shè)FP(函數(shù)式編程)課程,F(xiàn)P的思想對(duì)理解數(shù)據(jù)結(jié)構(gòu)和算法有很好的幫助  回復(fù)  更多評(píng)論   

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

            @oldman
            對(duì)您提出的意見(jiàn)表示感謝
            但是, 這文章是轉(zhuǎn)csdn上的一篇帖子,帖子的地址您可以在文章的最開(kāi)始處看到,基于尊重原創(chuàng)的想法,我覺(jué)得還是不要去修改的好。
            再次表示感謝!  回復(fù)  更多評(píng)論   

            国产精品狼人久久久久影院| 狠狠色丁香久久婷婷综合图片 | 久久精品国产精品亚洲精品| 久久久久久亚洲精品成人| 久久久久亚洲Av无码专| 免费观看久久精彩视频| 久久综合一区二区无码| 亚洲欧美日韩中文久久| 精品综合久久久久久97超人| 国产午夜精品久久久久九九电影| 少妇久久久久久被弄高潮| 久久人人爽人人爽人人片AV麻豆| 亚洲日本va午夜中文字幕久久| 亚洲AV无码1区2区久久| 久久精品国产精品青草| 国产成人久久精品麻豆一区| 午夜视频久久久久一区 | 亚洲va久久久噜噜噜久久男同| 无码久久精品国产亚洲Av影片| 久久精品国产亚洲沈樵| 香蕉久久影院| 91视频国产91久久久| 色青青草原桃花久久综合| 国产精品久久久久久久久鸭| 日本精品久久久久影院日本| 1000部精品久久久久久久久| 伊人久久大香线蕉综合网站| 中文字幕亚洲综合久久2| 国产成年无码久久久免费| 久久精品国产精品亚洲| 新狼窝色AV性久久久久久| 久久免费大片| 久久久久久久波多野结衣高潮 | 亚洲精品乱码久久久久久| 久久精品欧美日韩精品| 久久久久久亚洲Av无码精品专口| 久久久久久亚洲精品不卡| 久久久久久夜精品精品免费啦| 亚洲国产一成久久精品国产成人综合| 亚洲国产精品久久66| 久久精品亚洲精品国产色婷|