幾個效率高的排序演算法

2021-05-23 16:43:08 字數 3658 閱讀 5114

實用排序演算法(複雜度小於等於o(n^2))中效率最低但實現並不是最簡單的的兩個,c、c++教材卻總喜歡拿來大講特講,非常不利於初學者養成「程式效率」的思維。

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

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

鴿巢排序,排序位元組串、寬位元組串最快的排序演算法,計數排序的變種(將計數緩衝區大小固定,少一次遍歷開銷),速度是stl中std::sort的20多倍,更重要的是實現極其簡單!缺點是需要乙個size至少等於待排序陣列取值範圍的緩衝區,不適合int等大範圍資料

c/c++ code

void

pigeonholesort(byte

*array,

intlength)

;

inti,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,

intlength)

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

=min

; t

<=

max; 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)

}int

partition(byte

*arr,

intleft,

intright)

swap(

&arr[i],

&arr[right]);

returni;}

void

quicksort(byte

*arr,

intleft,

intright)

}void

quicksort(byte

*array,

intlength)

這是速度與std::sort相當的三路劃分快排

c/c++ code

void

swap(byte

*a,byte *b)

}void

quicksort(byte

*arr,

intleft,

intright)

if(arr[j]

==v)

}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,

intlength)

相當簡單的梳排序,效率是std::sort的三分之一

c/c++ code

void

combsort(byte

*arr,

intsize)

++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,

intleft,

intright)

}}void

radixsort(byte

*array,

intlength)

歸併排序,效率越是std::sort的六分之一,通常的實現是遞迴,但和快排不同,歸併改迴圈極其容易

c/c++ code

void

merge(byte

*array,

intlow,

intmid,

inthigh)

void

merge_sort(byte

*array, uint first, uint last)

void

mergesort(byte

*array, uint length)

這是堆排序,相對複雜些,效率是std::sort的四分之一

c/c++ code

uint parent(uint i)

uint left(uint i)

uint right(uint i)

void

max_heapify(byte

*a, uint i, uint length)

}void

build_max_heap(byte

*a, uint length)

void

heapsort(byte

*a, uint length)

}

StringBuilder的效率高麼?

import lint import system import system.text var data customer var cart jst hello your shopping cart has item s name description price quantity alert ...

union和in哪個效率高

一直都認為是in的效率要高,但是這次確有點矇圈。select from runinfo where status in 0,2,1,3,4,7,9,10 這個查詢的效率是,經常是1秒多。mysql select from runinfo where status in 0,2,1,3,4,7,9,1...

while for 遞迴函式 哪個效率高

for var oldlist array 0,0,0,0,0 var narr array new array for var i 0 i oldlist.length i trace narr while while i oldlist.length 遞迴code var oldlist arr...