#include "dkcOSIndependent.h"
dkcSort.hのインクルード依存関係図
このグラフは、どのファイルから直接、間接的にインクルードされているかを示しています。
型定義 | |
typedef int(WINAPIV * | DKC_SORT_COMPARE_TYPE )(const void *elem1, const void *elem2) |
関数 | |
DKC_EXTERN void WINAPI | dkcShellSort (void *base, size_t num, size_t width, DKC_SORT_COMPARE_TYPE compare) |
DKC_EXTERN void WINAPI | dkcCombSort (void *base, size_t num, size_t width, DKC_SORT_COMPARE_TYPE compare) |
DKC_EXTERN void WINAPI | dkcBubbleSort (void *base, size_t num, size_t width, DKC_SORT_COMPARE_TYPE compare) |
DKC_EXTERN void WINAPI | dkcBitonicSort (void *base, size_t num, size_t width, DKC_SORT_COMPARE_TYPE compare) |
DKC_EXTERN void WINAPI | dkcQuickSort (void *base, size_t num, size_t width, DKC_SORT_COMPARE_TYPE compare) |
DKC_EXTERN void WINAPI | dkcMultiPartitionSort (void *base, size_t num, size_t width, DKC_SORT_COMPARE_TYPE compare) |
DKC_EXTERN void WINAPI | dkcBlockSortEncode (void *buff, size_t buffsize) |
DKC_EXTERN void WINAPI | dkcBlockSortDecode (void *buff, size_t buffsize) |
DKC_EXTERN int WINAPI | dkcDistCountSortInt (size_t num, const int *src, int *dest, int Min_, int Max_) |
DKC_EXTERN int WINAPI | dkcDistCountSortShort (size_t num, const short *src, short *dest, short Min_, short Max_) |
dkcDistCountSortInt() | |
DKC_EXTERN int WINAPI | dkcDistCountSortChar (size_t num, const char *src, char *dest, char Min_, char Max_) |
dkcDistCountSortInt() |
d金魚
dkcSort.h で定義されています。
|
参照元 dkcBubbleSort(), dkcCombSort(), dkcQuickSort(), と dkcShellSort(). |
|
いわいるバイトニックソートをする。
|
|
|
|
|
|
いわゆるバブルソートをする。 参照先 BYTE, DKC_SORT_COMPARE_TYPE, と dkcSwap(). 参照元 dkcCombSort().
00060 { 00061 BYTE *b = (BYTE *)base; 00062 size_t i, j; 00063 00064 for(i=0; i<num-1; i++){ 00065 for(j=num-1; j>i; j--){ 00066 if(compare(&b[(j-1) * width],&b[j*width]) > 0/* *(b+j-1) > *(b+j) */) 00067 { 00068 dkcSwap(&b[(j-1) * width],&b[j*width],width); 00069 } 00070 } 00071 } 00072 00073 00074 00075 } |
|
いわいるコムソートをする。 参照先 BOOL, BYTE, DKC_SORT_COMPARE_TYPE, dkcBubbleSort(), dkcSwap(), FALSE, と TRUE.
00083 { 00084 00085 BYTE *b = (BYTE *)base; 00086 int gap = num; 00087 size_t first2 = num; 00088 BOOL swapped = FALSE; 00089 int newgap; 00090 size_t i,j; 00091 if ( gap < 1 ) { 00092 dkcBubbleSort(base,num,width,compare); 00093 return; 00094 } 00095 00096 do { 00097 newgap = (gap*10+3)/13; 00098 if ( newgap < 1 ) newgap = 1; 00099 first2 += newgap - gap; 00100 gap = newgap; 00101 swapped = FALSE; 00102 for (i = 0, j = first2; 00103 j != num; 00104 ++i, ++j) { 00105 //if ( b[j] < b[i] ) { 00106 if(compare(&b[i*width],&b[j*width]) > 0) 00107 { 00108 dkcSwap(&b[j*width],&b[i*width],width); 00109 swapped = TRUE; 00110 } 00111 } 00112 } while ( (gap > 1) || swapped ); 00113 } |
|
参照先 dkcAllocate(), dkcFree(), edk_OutOfMemory, edk_SUCCEEDED, と NULL.
00197 { 00198 int i, x; 00199 size_t ii; 00200 00201 char *count = (char *)dkcAllocate(sizeof(char) * (Max_)); 00202 if(NULL==count){ 00203 return edk_OutOfMemory; 00204 } 00205 for (ii = 0; ii < num; ii++){ 00206 count[a[ii] - Min_]++; 00207 } 00208 00209 for (i = 1; i <= Max_ - Min_; i++){ 00210 //count[i] += (char)count[i - 1]; 00211 count[i] = (char)(count[i] + count[i - 1]); 00212 } 00213 for (i = num - 1; i >= 0; i--) { 00214 x = a[i] - Min_; b[--count[x]] = a[i]; //debugged 00215 } 00216 dkcFree((void **)&count); 00217 return edk_SUCCEEDED; 00218 00219 00220 } |
|
Distribution count sort 分布数えソート。大量の記憶領域を使うがO(n)で極速! しかし、仮想記憶上ではほぼ意味無しか!?
参照先 dkcAllocate(), dkcFree(), edk_OutOfMemory, edk_SUCCEEDED, と NULL.
00141 { 00142 00143 int i, x; 00144 size_t ii; 00145 //static int count[Max_ - Min_ + 1]; 00146 //int *count = (int *)malloc(sizeof(int) * (Max_ - Min_ + 1)); 00147 //int *count = (int *)dkcAllocate(sizeof(int) * (Max_ - Min_ + 1)); 00148 int *count = (int *)dkcAllocate(sizeof(int) * (Max_ + Min_ + 1 )); 00149 if(NULL==count){ 00150 return edk_OutOfMemory; 00151 } 00152 //for (i = 0; i <= Max_ - Min_; i++) count[i] = 0; 00153 //memset(count,0,sizeof( 00154 //for (i = 0; i <= Max_ - Min_; i++) count[i] = 0; 00155 00156 for (ii = 0; ii < num; ii++){ 00157 count[a[ii] - Min_]++; 00158 } 00159 00160 for (i = 1; i <= Max_ - Min_; i++){ 00161 count[i] += count[i - 1]; 00162 } 00163 for (i = num - 1; i >= 0; i--) { 00164 x = a[i] - Min_; b[--count[x]] = a[i]; //debugged 00165 //x = a[i] - Min_; b[--count[x]] = x;//origin 00166 } 00167 dkcFree((void **)&count); 00168 return edk_SUCCEEDED; 00169 00170 } |
|
参照先 dkcAllocate(), dkcFree(), edk_OutOfMemory, edk_SUCCEEDED, と NULL.
00173 { 00174 int i, x; 00175 size_t ii; 00176 00177 short *count = (short *)dkcAllocate(sizeof(short) * (Max_)); 00178 if(NULL==count){ 00179 return edk_OutOfMemory; 00180 } 00181 for (ii = 0; ii < num; ii++){ 00182 count[a[ii] - Min_]++; 00183 } 00184 00185 for (i = 1; i <= Max_ - Min_; i++){ 00186 //count[i] += count[i - 1]; 00187 count[i] = (short)(count[i] + count[i - 1]); 00188 } 00189 for (i = num - 1; i >= 0; i--) { 00190 x = a[i] - Min_; b[--count[x]] = a[i]; //debugged 00191 } 00192 dkcFree((void **)&count); 00193 return edk_SUCCEEDED; 00194 } |
|
いわいるマルチパーテーションソート(多重分割ソート) http://www.tokuyama.ac.jp/home/~kawamura/
|
|
いわいるクイックソートをする。(qsortを使いましょう^^;
00118 { 00119 qsort(base,num,width,compare); 00120 } |
|
いわいるシェルソートをする。 参照先 BYTE, DKC_SORT_COMPARE_TYPE, と dkcSwap().
00016 { 00017 //(int n, keytype a[]) /* a[0..n-1] を昇順に */ 00018 00019 int h, i, j; 00020 int n = (int)num; 00021 BYTE *x = malloc(width); 00022 BYTE *a = (BYTE *)base; 00023 00024 //BYTE *end = a + ((num - 1) * width); 00025 00026 h = 13; 00027 while (h < n){ 00028 h = 3 * h + 1; 00029 } 00030 //h /= 9; 00031 h = ( h - 1 ) / 3; 00032 while (h > 0) { 00033 for (i = h; i < n; i++) { 00034 //x = a[i]; 00035 //memmove(x,&a[i * width],width); 00036 dkcSwap(x,&a[i * width],width); 00037 for (j = i - h; 00038 j >= 0 ; /*a[j * width] > x*/ 00039 j -= h) 00040 { 00041 if(compare(&a[j * width],x) > 0) 00042 { 00043 //a[(j + h) * width] = a[j * width]; 00044 dkcSwap(&a[(j + h) * width] , &a[j * width],width); 00045 }else{ 00046 break; 00047 } 00048 } 00049 //a[(j + h) * width] = x; 00050 //memmove(&a[(j + h) * width], x ,width); 00051 dkcSwap(&a[(j + h) * width],x ,width); 00052 } 00053 //h /= 3; 00054 h = ( h - 1 ) / 3; 00055 } 00056 free(x); 00057 } |