鴿巢排序,排序位元組串、寬位元組串最快的排序演算法,計數排序的變種(將計數緩衝區大小固定,少一次遍曆開銷),速度是STL中std::sort的20多倍
,更重要的是實現極其簡單!缺點是需要一個size至少等於待排序數組取值範圍的緩衝區,不適合int等大範圍資料。
void PigeonholeSort(BYTE *array, int length)<br />{<br /> int b[256] = {0};<br /> int i,k,j = 0;<br /> for(i=0; i<length; i++)<br /> b[array[i]]++;<br /> for(i=0; i<256; i++)<br /> for(k=0; k<b[i]; k++)<br /> array[j++] = i;<br />}
多一次遍曆的計數排序,排序位元組串的話速度約是鴿巢排序的一半。
void CountingSort(BYTE *array, int length)<br />{<br /> int t;<br /> int i, z = 0;<br /> BYTE min,max;<br /> int *count;<br /> min = max = array[0];<br /> for(i=0; i<length; i++)<br /> {<br /> if(array[i] < min)<br /> min = array[i];<br /> else if(array[i] > max)<br /> max = array[i];<br /> }<br /> count = (int*)malloc((max-min+1)*sizeof(int));<br /> for(i=0; i<max-min+1; i++)<br /> count[i] = 0;<br /> for(i = 0; i < length; i++)<br /> count[array[i]-min]++;<br /> for(t = min; t <= max; t++)<br /> for(i = 0; i < count[t-min]; i++)<br /> array[z++] = (BYTE)t;<br /> free(count);<br />}<br />
快速排序,快排最標準的遞迴實現,速度約是std::sort的一半
void swap(BYTE *a,BYTE *b)<br />{<br /> BYTE tmp;<br /> if ( a != b )<br /> {<br /> tmp = *a;<br /> *a = *b;<br /> *b = tmp;<br /> }<br />}<br />int partition(BYTE *arr,int left, int right)<br />{<br /> int i = left - 1, j = right;<br /> BYTE v = arr[right];<br /> while(1)<br /> {<br /> while(arr[++i] < v);<br /> while(arr[--j] > v)<br /> if(j == 1)<br /> break;<br /> if(i >= j)<br /> break;<br /> swap(&arr[i],&arr[j]);<br /> }<br /> swap(&arr[i],&arr[right]);<br /> return i;<br />}<br />void quicksort(BYTE *arr, int left, int right)<br />{<br /> if (left < right)<br /> {<br /> int i = partition(arr,left,right);<br /> quicksort(arr,left,i-1);<br /> quicksort(arr,i+1,right);<br /> }<br />}<br />void QuickSort(BYTE *array,int length)<br />{<br /> quicksort(array,0,length-1);<br />}<br />
這是速度與std::sort相當的三路劃分快排
void swap(BYTE *a,BYTE *b)<br />{<br /> BYTE tmp;<br /> if ( a != b )<br /> {<br /> tmp = *a;<br /> *a = *b;<br /> *b = tmp;<br /> }<br />}<br />void quicksort(BYTE *arr, int left, int right)<br />{<br /> if (left < right)<br /> {<br /> BYTE v = arr[right];<br /> int i = left - 1,j = right,p = left - 1,q = right,k=0;<br /> while (1)<br /> {<br /> while (arr[++i] < v);<br /> while (arr[--j] > v)<br /> if(j==left)<br /> break;<br /> if (i >= j)<br /> break;<br /> swap(&arr[i], &arr[j]);<br /> if(arr[i] == v)<br /> {<br /> p++;<br /> swap(&arr[p],&arr[i]);<br /> }<br /> if(arr[j] == v)<br /> {<br /> q--;<br /> swap(&arr[q],&arr[j]);<br /> }<br /> }<br /> swap(&arr[i],&arr[right]);<br /> j = i - 1;<br /> i++;<br /> for(k=left; k<=p; k++,j--)<br /> swap(&arr[k],&arr[j]);<br /> for(k=right-1; k>=q; k--,i++)<br /> swap(&arr[k],&arr[i]);<br /> quicksort(arr,left,j);<br /> quicksort(arr,i,right);<br /> }<br />}<br />void QuickSort(BYTE *array,int length)<br />{<br /> quicksort(array,0,length-1);<br />}<br />
相當簡單的梳排序,效率是std::sort的三分之一
void CombSort(BYTE *arr, int size)<br />{<br /> UINT gap = size, swapped = 1, i = 0;<br /> BYTE swap = 0;<br /> while ((gap > 1) || swapped)<br /> {if (gap > 1)<br /> gap = gap / 1.3;<br /> swapped = 0;<br /> i = 0;<br /> while ((gap + i) < size)<br /> {<br /> if (arr[i] - arr[i + gap] > 0)<br /> {<br /> swap = arr[i];<br /> arr[i] = arr[i + gap];<br /> arr[i + gap] = swap;<br /> swapped = 1;<br /> }<br /> ++i;<br /> }<br /> }<br />}<br />
LSD基數排序,與std::sort速度相當,但是需要一個與輸入緩衝一樣大的緩衝區
#define R 256<br />#define digit(a, d) ( a >> 8*d )<br />static BYTE *aux;<br />void radix_sort(BYTE *arr, int left, int right)<br />{<br /> if(left < right)<br /> {<br /> int d = 0;<br /> for(d=3; d>=0; d--)<br /> {<br /> int i=0, j=0, count[R+1];<br /> for(j=0; j<R; j++)<br /> count[j] = 0;<br /> for(i=left; i<=right; i++)<br /> count[digit(arr[i],d) + 1]++;<br /> for(j=1; j<R; j++)<br /> count[j] += count[j-1];<br /> for(i=left; i<=right; i++)<br /> aux[count[digit(arr[i],d)]++] = arr[i];<br /> for(i=left; i<=right; i++)<br /> arr[i] = aux[i-1];<br /> }<br /> }<br />}<br />void RadixSort(BYTE *array,int length)<br />{<br /> aux = (BYTE*)malloc(length);<br /> radix_sort(array,0,length-1);<br /> free(aux);<br />}<br />
歸併排序,效率越是std::sort的六分之一,通常的實現是遞迴,但和快排不同,歸併改迴圈極其容易
void merge(BYTE *array, int low, int mid, int high)<br />{<br /> int i, k;<br /> BYTE *temp = (BYTE *) malloc(high-low+1);<br /> int begin1 = low;<br /> int end1 = mid;<br /> int begin2 = mid + 1;<br /> int end2 = high;<br /> for (k = 0; begin1 <= end1 && begin2 <= end2; ++k)<br /> if(array[begin1]<array[begin2])<br /> temp[k] = array[begin1++];<br /> else<br /> temp[k] = array[begin2++];<br /> while(begin1<=end1)<br /> temp[k++] = array[begin1++];<br /> while(begin2<=end2)<br /> temp[k++] = array[begin2++];<br /> for (i = 0; i < (high-low+1); i++)<br /> array[low+i] = temp[i];<br /> free(temp);<br />}<br />void merge_sort(BYTE *array, UINT first, UINT last)<br />{<br /> UINT mid,i;<br /> for(mid=1; mid<=last-first; mid += mid)<br /> for(i=first; i<=last-mid; i+=mid+mid)<br /> merge(array,i,i+mid-1,min(i+mid+mid-1,last));<br />}<br />void MergeSort(BYTE *array, UINT length)<br />{<br /> merge_sort(array,0,length-1);<br />}<br />