メインページ | 構成 | ファイル一覧 | 構成メンバ | ファイルメンバ | 関連ページ

dkcSort.h

sort utility... qsort() like [詳細]

#include "dkcOSIndependent.h"

dkcSort.hのインクルード依存関係図

Include dependency graph

このグラフは、どのファイルから直接、間接的にインクルードされているかを示しています。

Included by dependency graph

ソースコードを見る。

型定義

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()


説明

sort utility... qsort() like

d金魚

から:
2004/04/28
覚え書き:
sort系のものたくさん。

dkcSort.h で定義されています。


型定義

typedef int(WINAPIV * DKC_SORT_COMPARE_TYPE)(const void *elem1, const void *elem2)
 

dkcSort.h17 行で定義されています。

参照元 dkcBubbleSort(), dkcCombSort(), dkcQuickSort(), と dkcShellSort().


関数

DKC_EXTERN void WINAPI dkcBitonicSort void *  base,
size_t  num,
size_t  width,
DKC_SORT_COMPARE_TYPE  compare
 

いわいるバイトニックソートをする。

TODO:
実装できないかもしれない。

DKC_EXTERN void WINAPI dkcBlockSortDecode void *  buff,
size_t  buffsize
 

DKC_EXTERN void WINAPI dkcBlockSortEncode void *  buff,
size_t  buffsize
 

DKC_EXTERN void WINAPI dkcBubbleSort void *  base,
size_t  num,
size_t  width,
DKC_SORT_COMPARE_TYPE  compare
 

いわゆるバブルソートをする。

dkcSort.c59 行で定義されています。

参照先 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 }

DKC_EXTERN void WINAPI dkcCombSort void *  base,
size_t  num,
size_t  width,
DKC_SORT_COMPARE_TYPE  compare
 

いわいるコムソートをする。

dkcSort.c83 行で定義されています。

参照先 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 }

DKC_EXTERN int WINAPI dkcDistCountSortChar size_t  num,
const char *  src,
char *  dest,
char  Min_,
char  Max_
 

dkcDistCountSortInt()

dkcSort.c196 行で定義されています。

参照先 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 }

DKC_EXTERN int WINAPI dkcDistCountSortInt size_t  num,
const int *  src,
int *  dest,
int  Min_,
int  Max_
 

Distribution count sort 分布数えソート。大量の記憶領域を使うがO(n)で極速! しかし、仮想記憶上ではほぼ意味無しか!?

覚え書き:
0~USHRT_MAXまでの値しか使えません。ヽ(`Д´)ノウワァン
戻り値:
edk_SUCCEEDEDで成功

dkcSort.c140 行で定義されています。

参照先 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 }

DKC_EXTERN int WINAPI dkcDistCountSortShort size_t  num,
const short *  src,
short *  dest,
short  Min_,
short  Max_
 

dkcDistCountSortInt()

dkcSort.c172 行で定義されています。

参照先 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 }

DKC_EXTERN void WINAPI dkcMultiPartitionSort void *  base,
size_t  num,
size_t  width,
DKC_SORT_COMPARE_TYPE  compare
 

いわいるマルチパーテーションソート(多重分割ソート) http://www.tokuyama.ac.jp/home/~kawamura/

TODO:
実装できないかもしれない。

DKC_EXTERN void WINAPI dkcQuickSort void *  base,
size_t  num,
size_t  width,
DKC_SORT_COMPARE_TYPE  compare
 

いわいるクイックソートをする。(qsortを使いましょう^^;

TODO:
qsortのラッパーに終わるかもしれない。

dkcSort.c117 行で定義されています。

参照先 DKC_SORT_COMPARE_TYPE.

00118 {
00119     qsort(base,num,width,compare);
00120 }

DKC_EXTERN void WINAPI dkcShellSort void *  base,
size_t  num,
size_t  width,
DKC_SORT_COMPARE_TYPE  compare
 

いわいるシェルソートをする。

dkcSort.c16 行で定義されています。

参照先 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 }


dkutil_cに対してSun Jul 18 22:46:19 2004に生成されました。 doxygen 1.3.6