Esempio n. 1
0
/* myqsort -- a cheap implementation of Quicksort on integers
		-- returns number of swaps */
static int myqsort(int *a, int num)
{
	int	i, j, tmp, v;
	int	numswaps;

	numswaps = 0;
	if ( num <= 1 )
		return 0;

	i = 0;	j = num;	v = a[0];
	for ( ; ; )
	{
		while ( a[++i] < v )
			;
		while ( a[--j] > v )
			;
		if ( i >= j )	break;

		tmp = a[i];
		a[i] = a[j];
		a[j] = tmp;
		numswaps++;
	}

	tmp = a[0];
	a[0] = a[j];
	a[j] = tmp;
	if ( j != 0 )
		numswaps++;

	numswaps += myqsort(&a[0],j);
	numswaps += myqsort(&a[j+1],num-(j+1));

	return numswaps;
}
Esempio n. 2
0
void myqsort(void const * base, int lo, int hi, int size, _cmpfun cmp) {
  int pivot;
  if (lo < hi) {
    pivot = partition(base, lo, hi, size, cmp);
    if (hi - lo > 4) taskDelay(NO_WAIT);
    myqsort(base, lo, pivot - 1, size, cmp);
    myqsort(base, pivot + 1, hi, size, cmp);
  }
}
Esempio n. 3
0
void myqsort(int A[], int p, int q)
{
	if(p < q){
		int r;
		r = partition(A, p, q);
		myqsort(A, p, r);
		myqsort(A, r+1, q);
	}
}
Esempio n. 4
0
// quick sort
// s                      e 
// 6 6 3 8 7 4 5 9 0 1 6 2 || 6 6 3 8 7 4 5 9 0 1 6 2  || 6 6 3 2 7 4 5 9 0 1 6 8  
// p_i___________________j || p_____i_______________j  || p_______i___________j__
// 6 6 3 2 7 4 5 9 0 1 6 8 || 6 6 3 2 1 4 5 9 0 7 6 8  || 6 6 3 2 1 4 5 9 0 7 6 8     
// p_______i_________j____ || p_________i_____j______  || p_____________i_j______
// 6 6 3 2 1 4 5 0 9 7 6 8 if j < i we stop, some properties: x at the left side of i are <= p;
// p_____________j_i______ y at the right side of j are >= p; 
// since we use a[s] as pivot, after each round, we need to swap p to the middle and do not sort it 
// in the next round of two sides(left, right), x<=p, p, p<=y; but swap p with j or i ? both are ok. 
// 0 6 3 2 1 4 5 6 9 7 6 8  
// ______________j_i______
void myqsort(std::vector<int> &a, int s, int e)
{
	if (s >= e || s < 0 || e > a.size())
		return;

	const int p = a[s]; // use the first one as pivot
	int i = s + 1;
	int j = e - 1; 
	if (i > j)		    // if (i>=j) error, for example {3 2};
		return;

	bool bRun = true;
	while (bRun)
	{
		// 1. i cannot = e. 2. ==p can at the left side.
		while (i < e && a[i] <= p)
			++i; 
		// 1. s is used by pivot, j stop when == s. 2. ==p can at the right side too.
		while (j > s && a[j] >= p)
			--j;

		if (j > i)
		{
			int t = a[i];
			a[i] = a[j];
			a[j] = t;

			++i;
			--j;
		}
		else if (j < i)
		{
			a[s] = a[j];
			a[j] = p;

			bRun = false;
		}
		else if (j == i)
			assert(false); // why not possible in our case (a[s] is pivot and x<=p and y>= p)?
	};

	if (0)
	{
		printf("Afater sort array: (p%d, s%d, e%d) \n", p, s, e);
		for (int ii = 0; ii < a.size(); ++ii)
		{
			printf("%d, ", a[ii]); 
		}
		printf("\n");
	}

	myqsort(a, s, j);
	myqsort(a, i, e);
} 
Esempio n. 5
0
int myqsort(int *arry, int low, int high)
{
	int pivottag;

	if(low >= high)
		return 0;
	
	pivottag = partition(arry, low, high);
	myqsort(arry, low, pivottag-1);
	myqsort(arry, pivottag+1, high);

	return 0;
}
Esempio n. 6
0
int main(int argc,char *argv[])
{
	char *lineptr[LINES];	/* pointers to text lines */
	int nlines;		/* number of input lines read */
	int c,rc=0;

	while(--argc > 0 && (*++argv)[0] == '-') {
		while(c = *++argv[0])
			switch(c)
			{
				case 'f':
						option |= FOLD;
						break;
				case 'n':
						option |= NUMERIC;
						break;
				case 'r':
						option |= DECR;
						break;
				default:
						printf("sort: illegal option %c\n",c);
						argc=1;
						rc=-1;
						break;
			}
	}
	if (argc)
		printf("Usage: sort -fnr \n");
	else
	{
		if((nlines=readlines(lineptr,LINES)) > 0)
		{
			if(option & NUMERIC)
				myqsort((char **)lineptr,0,nlines-1,(int (*)(void *,void *))numcmp);
			else if (option & FOLD)
				myqsort((char **)lineptr,0,nlines-1,(int (*)(void *,void *))charcmp);
			else
				myqsort((char **)lineptr,0,nlines-1,(int (*)(void *,void *))strcmp);

			writelines(lineptr,nlines,option & DECR);
		}
		else
		{
			printf("input too big to sort \n");
			rc = -1;
		}

	return rc;
	
	}
}
Esempio n. 7
0
int main(int argc, char **argv)
{
	// save lines inputed in a pointer array 
	int lines, revert, fold, directory;
	fold = directory = 0;
	revert = 1;

	// Use dynamic allocation memory: Umm... maybe in the next time.
	char alloc[ALLOCSIZE];
	char *ptarr[MAXLINES];
	// Check argument
	while (--argc > 0 && (*++argv)[0] == '-')
	{
		char *p;
		p = argv[0];
		if (!setopt(p,&directory, &revert, &fold))	
		{
			youneedhelp();
			return EXIT_FAILURE;
		}
	}

	while ((lines = readlines(ptarr, MAXLINES, alloc)) > 0)
	{
		// any pointer can be cast to void * and back again without loss of information.
		int (*comp)(void *, void *, int);
		// Is it too long :(
		comp = (int (*)(void *, void *, int))(directory ? strdfcmp : strfcmp); 
		// sorting use quick sort algorithm.
		myqsort((void**)ptarr, 0, lines-1, comp, fold, revert);
		writelines(ptarr,lines);
	}
	return EXIT_SUCCESS;
}
Esempio n. 8
0
File: hw2.c Progetto: goTJ/tj
int main()
{
	clock_t begin, end;
	Type *data;
	int n, i;
	freopen("test_data.txt", "r", stdin);
	FILE *fout=fopen("result.txt", "w");

	scanf("%d", &n);
	data = (Type *)malloc(sizeof(Type)*n);
	for(i=0; i<n; i++)
		scanf("%f", &data[i]);
	begin = clock();
	myqsort(data, n);
	end = clock();
	fprintf(fout, "%d\n", n);
	for(i=0; i<n; i++){
		if((i%10) == 9)
			fprintf(fout, "%10.3f\n", data[i]);
		else
			fprintf(fout, "%10.3f ", data[i]);
	}
	free(data);
	fclose(fout);

	printf("time = %.3f sec\n", (double)(end-begin)/CLOCKS_PER_SEC);
	return 0;
}
Esempio n. 9
0
File: 5-14.c Progetto: jlegoff/misc
int main(int argc, char *argv[])
{
     int nlines;
     int numeric = 0;
     int asc = 1;
     int i;

     while (argc-- > 1) {
	  if (strcmp(argv[argc], "-n") == 0)
	       numeric = 1;
	  else if (strcmp(argv[argc], "-r") == 0)
	       asc = -1;
     }
     if (argc > 1 && strcmp(argv[1], "-n") == 0)
	  numeric = 1;
     if ((nlines = readlines(lineptr, MAXLINES)) >= 0) {
	  myqsort((void **) lineptr, 0, nlines-1,
		  (int (*)(void*,void*))(numeric ? numcmp : strcmp), asc);
	  writelines(lineptr, nlines);
	  return 0;
     } else {
	  printf("input too big to sort\n");
	  return 1;
     }
}
Esempio n. 10
0
/* myqsort: sort v[left] ... v[right] inot assending order */
static void myqsort( char *v[], int left, int right, int (*comp)( char *a, char *b ) ) {
  int i, last;

  if ( left >= right ) {
    return;
  }
  swap( v, left, (left + right) / 2 );
  last = left;
  for ( i = left+1; i <= right; i++ ) {
    if ( (*comp)( v[i], v[left] ) < 0 ) {
      swap( v, ++last, i );
    }
  }
  swap( v, left, last );
  myqsort( v, left, last-1, comp );
  myqsort( v, last+1, right, comp );
}
Esempio n. 11
0
File: 5-14.c Progetto: jlegoff/misc
void myqsort(void *v[], int left, int right,
	     int (*comp)(void*, void*), int asc)
{
     int i, last;
     void swap(void *v[], int, int);

     if (left >= right)
	  return;
     swap(v, left, (left+right)/2);
     last = left;
     for (i = left+1; i <= right; i++)
	  if (asc * (*comp)(v[i], v[left]) < 0)
	       swap(v, ++last, i);
     swap(v, left, last);
     myqsort(v, left, last-1, comp, asc);
     myqsort(v, last+1, right, comp, asc);
}
Esempio n. 12
0
void myqsort(void *v[], int left, int right,
	   int (*cmp)(void *, void *), int reverse)
{
    int i, last;
    void swap(void *v[], int, int);

    if (left >= right)
	return;
    swap(v, left, (left+right)/2);
    last = left;
    for (i = left+1; i <= right; ++i)
	if (reverse * (*cmp)(v[i], v[left]) < 0)
	    swap(v, ++last, i);
    swap(v, left, last);
    myqsort(v, left, last-1, cmp, reverse);
    myqsort(v, last+1, right, cmp, reverse);
}
Esempio n. 13
0
File: qsort.c Progetto: Nedargo/misc
void myqsort(void *base, size_t num, size_t size,
	int (*comparator)(const void *, const void *))
{
    if (size == 1)
	return;
    int  i;
    int  farside = (num-1);
    for (i = 1; farside > i; i++)
    {
	if ((*comparator)(base, base + i*size) >= 0) {
	    swap(base + farside*size, base + i*size, size);
	    farside--;
	}
    }
    myqsort(base,              num/2,       size, comparator);
    myqsort(base + num/2*size, num - num/2, size, comparator);
}
Esempio n. 14
0
int myqsortEntry(_Vx_usr_arg_t pDa, _Vx_usr_arg_t pCmp) {
	DynArray * da = (DynArray *)pDa;
	_cmpfun * cmp = (_cmpfun *)pCmp;
	
	myqsort(da->array, 0, da->used - 1, sizeof(char*), cmp);
	
	return 0;
}
Esempio n. 15
0
static void myqsort(void *v[], int left, int right, int (*comp)(void *, void *)) {

    int i;
    int last;

    if (left >= right)
        return;

    swap(v, left, (left + right) / 2);
    last = left;
    for (i = left + 1; i <= right; i++)
        if ((*comp)(v[i], v[left]) < 0)
            swap(v, ++last, i);
    swap(v, left, last);
    myqsort(v, left, last - 1,  comp);
    myqsort(v, last + 1, right, comp);

}
Esempio n. 16
0
void myqsort(char *v[],int left,int right, int (*comp)(void *,void *))
{
	int i,last;
	void swap(char *v[],int i,int j);

	if(left>=right)	/* do nothing if array contains */
		return;	/*fewer that two elements */

	swap(v,left,(left+right)/2);

	last=left;

	for(i = left + 1; i <=right;i++)
		if((*comp)(v[i],v[left])<0)
			swap(v,++last,i);
	swap(v,left,last);
	myqsort(v,left,last-1, comp);
	myqsort(v,last+1,right, comp);
}
Esempio n. 17
0
File: sort.c Progetto: wyc2012/wyc
void myqsort(DType x[], int l, int u)
{	int i, j;
	DType t, temp;
	if (u - l < cutoff)
		return;
	swap(x, l, randint(l, u));
	t = x[l];
	i = l;
	j = u+1;
	for (;;) {
		do i++; while (i <= u && x[i] < t);
		do j--; while (x[j] > t);
		if (i > j)
			break;
		temp = x[i]; x[i] = x[j]; x[j] = temp;
	}
	swap(x, l, j);
	myqsort(x, l, j-1);
	myqsort(x, j+1, u);
}
Esempio n. 18
0
int main()
{
    int test[] = {1, 3, 4, 8, 7, 4, 9, 6, 100}, n = 9;
    int *y = malloc(sizeof(int) * n);
    y = myqsort(test, n);
    int i;
    for(i=0;i<n;i++) {
        printf("%d ", y[i]);
    }
    printf("\n");
    return 0;
}
Esempio n. 19
0
int *myqsort(int x[], int n)
{
    int pivot = x[0], i, j;
    int left[n], right[n], lcnt=0, rcnt=0;
    int *ltmp, *rtmp, *ans;
    //printf("nothing happens!\n");
    ans = malloc(sizeof(int) * n);
    if(n == 1) {
        //printf("here!\n");
        return x;
    }
    for(i=1;i<n;i++) {
        if(x[i]<pivot) {
            left[lcnt++] = x[i];
        } else {
            right[rcnt++] = x[i];
        }
        //printf("%d ", x[i]);
    }
    if(lcnt > 0) {
        ltmp = malloc(sizeof(int) * lcnt);
        ltmp = myqsort(left, lcnt);
    }
    if(rcnt > 0) {
        rtmp = malloc(sizeof(int) * rcnt);
        rtmp = myqsort(right, rcnt);
    }
    ans[lcnt] = pivot;
    for(i=0;i<n;i++) {
        if(i<lcnt) {
            ans[i] = ltmp[i];
        }
        else if(i>lcnt) {
            ans[i] = rtmp[i-lcnt-1];
        }
        //printf("%d ", ans[i]);
    }
    //printf("\n");
    return ans;
}
Esempio n. 20
0
int	px_sign(const PERM *px)
{
	int	numtransp;
	PERM	*px2;

	if ( px==(PERM *)NULL )
		error(E_NULL,"px_sign");
	px2 = px_copy(px,PNULL);
	numtransp = myqsort((int *)px2->pe,px2->size);
	px_free(px2);

	return ( numtransp % 2 ) ? -1 : 1;
}
Esempio n. 21
0
int sort(int numeric)
{
	int	nlines;
	char	*lineptr[MAXLINES];
	
	if( (nlines = readlines(lineptr, MAXLINES)) >= 0 ){
		myqsort(lineptr, 0, nlines - 1,  getcmp() );
		writelines( lineptr, nlines );
		return 0;
	}else{
		printf("error: input too big to sort\n");
		return 1;
	}
}
Esempio n. 22
0
int main(char **, int)
{
	/*
	int b[] = {6,6,3,8,7,4,5,9,0,1,6,2 }; 
	std::vector<int> a;
	a.insert(a.end(), &b[0], &b[sizeof(b) / sizeof(int)] );	
	*/
	srand( time(0) ); 
	std::vector<int> a(10);
	for (int i = 0; i < a.size(); ++i)
	{
		a[i] = rand(); 
	}
	printf("Init array: \n");
	for (int i = 0; i < a.size(); ++i)
	{
		printf("%d, ", a[i]); 
	}
	printf("\n");
	
	myqsort(a, 0, a.size()); 
				 	
	printf("Final array: \n");
	for (int i = 0; i < a.size(); ++i)
	{
		printf("%d, ", a[i]); 
	}
	printf("\n");
	
	// to check if the result is right or wrong
	bool bSucceed = true;
	for (int i = 0; i < a.size() - 1; ++i)
	{
		if (a[i] > a[i + 1])
		{
			bSucceed = false;
			break;
		}
	}
	if (bSucceed)
		printf("myqsort - Succeed!\n");
	else
		printf("myqsort - Fail!\n");
	scanf("%d");

	return 1; 
}
Esempio n. 23
0
//sort input lines
int main(int argc, char **argv)
{
    int nlines; //number of input lines
    int numeric = 0; //1 if numeric sort
    int reverse = 1; //-1 if reverse sort
    //int fold = 0; //1 if fold upper and lower case together

    char c;
    while (--argc > 0 && (*++argv)[0] == '-')
	while (c = *++argv[0])
	    switch (c) {
	    case 'n':
		numeric = 1;
		break;
	    case 'r':
		reverse = -1;
		break;
	    case 'f':
		fold = 1;
		break;
	    case 'd':
		directory = 1;
		break;
	    default:
		printf("sort: illegal option %c\n", c);
		return -1;
		break;
	    }
    
    int (*fp)(void *, void *);
    if (numeric)
	fp = (int (*)(void *, void *)) numcmp;
    else
	fp = (int (*)(void *, void *)) strcmpfd;
    
    if ((nlines = readlines(lineptr, MAXLINES)) >=0) {
	myqsort((void **) lineptr, 0, nlines-1, fp, reverse);
	writelines(lineptr, nlines);
	return 0;
    }
    else {
	printf("input too big to sort\n");
	return 1;
    }
}
Esempio n. 24
0
int main()
{
	int arry[10] = {1,3,5,7,5,2,4,6,8,10};
	int i;

	for(i = 0; i < 10; i ++)
		printf("%2d ", arry[i]);
	putchar(10);
	
//	myqsort(arry,10,sizeof(int), compare);
	myqsort(arry,0, 10 - 1);

	for(i = 0; i < 10; i ++)
		printf("%2d ", arry[i]);
	putchar(10);
	
	return 0;
}
size_t remove_duplicate_npre(NPredictItem *npre_items, size_t npre_num) {
  if (NULL == npre_items || 0 == npre_num)
    return 0;

  myqsort(npre_items, npre_num, sizeof(NPredictItem), cmp_npre_by_hanzi_score);

  size_t remain_num = 1;  // The first one is reserved.
  for (size_t pos = 1; pos < npre_num; pos++) {
    if (utf16_strncmp(npre_items[pos].pre_hzs,
                      npre_items[remain_num - 1].pre_hzs,
                      kMaxPredictSize) != 0) {
      if (remain_num != pos) {
        npre_items[remain_num] = npre_items[pos];
      }
      remain_num++;
    }
  }
  return remain_num;
}
Esempio n. 26
0
/* main program */
int main( int argc, char *argv[] ) {
  int nlines;
  int numeric = 0; /* 1 -- numeric; 0 -- string */

  if ( argc > 1 && strcmp( argv[ 1 ], "-n" ) == 0 ) {
    numeric = 1;
  }
  if ( (nlines = readlines( lineptr, MAXLINE )) >= 0 ) {
    //printf( "+++++++++++++++++++++before sorting++++++++++++++++=\n" );
    //writelines( lineptr, nlines );
    myqsort( (char **) lineptr, 0, nlines-1,
	   (int (*)(char *, char *))(numeric ? ncmp : strcmp) );
    printf( "+++++++++++++++++++++after sorting++++++++++++++++=\n" );
    writelines( lineptr, nlines );
    return 0;
  } else {
    printf( "input too big to store\n" );
    return 0;
  }
}
Esempio n. 27
0
int main(int argc, char *argv[])
{
	srand(time(NULL));
	int A[max];
	int inum, i;
	FILE *file;
	file = fopen(argv[1], "r");
	inum = 0;
	while(fscanf(file, "%d", &A[inum]) != EOF){
		inum++;
	}
	fclose(file);

	myqsort(A, 0, inum-1);
	for(i = 0; i < inum; i++){
		printf("%d ", A[i]);
	}
	printf("\n");

	return 0;
}
Esempio n. 28
0
int main(int argc, char *argv[]) {

    int  nlines;          // Number of input lines to read
    bool numeric = false; // 'true' if numeric sort
    bool descend = false; // 'true' if descending output
    bool fold    = false; // 'true' if case insensitive sort
    bool dir     = false; // 'true' if directory order sort
    char c;

    // Evaluate arguments

    while (--argc > 0 && (*++argv)[0] == '-')
        while ((c = *++argv[0]) != '\0')
            switch (c) {
                case 'n':
                    numeric = true;
                    break;
                case 'r':
                    descend = true;
                    break;
                case 'f':
                    fold = true;
                    break;
                case 'd':
                    dir = true;
                    break;
                default:
                    printf("sort: illegal option %c\n", c);
                    exit(EXIT_FAILURE);
            }

    if (argc == 0) {
        printf("usage: sort -dnfr [FILE]\n");
        exit(EXIT_FAILURE);
    }

    // Read in the lines into memory

    if ((nlines = readlines(lineptr, MAXLINES)) < 0) {
        printf("Input is too big to sort\n");
        exit(EXIT_FAILURE);
    }

    // Sort

    if (numeric)
        myqsort(
                (void **) lineptr,
                0,
                nlines - 1,
                (int (*)(void*, void*))numcmp
            );
    else if (fold && dir)
        myqsort(
                (void **) lineptr,
                0,
                nlines - 1,
                (int (*)(void*, void*))folddircmp
            );
    else if (fold)
        myqsort(
                (void **) lineptr,
                0,
                nlines - 1,
                (int (*)(void*, void*))foldcmp
            );
    else if (dir)
        myqsort(
                (void **) lineptr,
                0,
                nlines - 1,
                (int (*)(void*, void*))dircmp
            );
    else
        myqsort(
                (void **) lineptr,
                0,
                nlines - 1,
                (int (*)(void*, void*))strcmp
            );

    // Write out the results

    writelines(lineptr, nlines, descend);

    return 0;
}
Esempio n. 29
0
int main(int argc, char* argv[])
{
    FILE *f;        // исходный файл
    FILE *f1;       // файл для печати
    int *n=0, *c=0; // указатель на начало и после конца массива
    int *m=0, *d=0; // указатель на начало и после конца отфилтрованного массива
    setlocale(0, "russian");

    if (argc < 4)
    {
        printf("Нет достаточного числа аргументов!");
        return BADARG;
    }
    f = fopen(argv[1], "r");
    if (f == NULL)
    {
        printf("Невозможно открыть исходный файл!");
        return BADINFILE;
    }
    if (readarray(f, &n, &c))
        {
            printf("Невозможно выделить память под исходный массив!");
            fclose(f);
            return FAILEDINMEM;
	}
    f1 = fopen(argv[2], "w");
    if (f1 == NULL)
    {
        printf("Невозможно открыть файл результата!");\
        fclose(f);
        free(n);
        return BADOUTFILE;
    }

    if (strcmp(argv[3], "-flt") == 0)
    {
        if (fltr(n, c, &m, &d))
        {
            printf("Невозможно выделить память под отфильтрованный массив!");
            fclose(f);
            fclose(f1);
            free(n);
            return FAILEDOUTMEM;
        }
        myqsort(m, d - m, sizeof(*m), compare_int);
        printmass(f1, m, d);
        free(n);
        free(m);
    }
    else
    {
        myqsort(n, c - n, sizeof(*n), compare_int);
        printmass(f1, n, c);
        free(n);
    }
    fclose(f);
    fclose(f1);
    printf("Успешно!");
    getch();
    return 0;
}
Esempio n. 30
0
bool NGram::build_unigram(LemmaEntry *lemma_arr, size_t lemma_num,
                          LemmaIdType next_idx_unused) {
  if (NULL == lemma_arr || 0 == lemma_num || next_idx_unused <= 1)
    return false;

  double total_freq = 0;
  double *freqs = new double[next_idx_unused];
  if (NULL == freqs)
    return false;

  freqs[0] = ADD_COUNT;
  total_freq += freqs[0];
  LemmaIdType idx_now = 0;
  for (size_t pos = 0; pos < lemma_num; pos++) {
    if (lemma_arr[pos].idx_by_hz == idx_now)
      continue;
    idx_now++;

    assert(lemma_arr[pos].idx_by_hz == idx_now);

    freqs[idx_now] = lemma_arr[pos].freq;
    if (freqs[idx_now] <= 0)
      freqs[idx_now] = 0.3;

    total_freq += freqs[idx_now];
  }

  double max_freq = 0;
  idx_num_ = idx_now + 1;
  assert(idx_now + 1 == next_idx_unused);

  for (size_t pos = 0; pos < idx_num_; pos++) {
    freqs[pos] = freqs[pos] / total_freq;
    assert(freqs[pos] > 0);
    if (freqs[pos] > max_freq)
      max_freq = freqs[pos];
  }

  // calculate the code book
  if (NULL == freq_codes_df_)
    freq_codes_df_ = new double[kCodeBookSize];
  assert(freq_codes_df_);
  memset(freq_codes_df_, 0, sizeof(double) * kCodeBookSize);

  if (NULL == freq_codes_)
    freq_codes_ = new LmaScoreType[kCodeBookSize];
  assert(freq_codes_);
  memset(freq_codes_, 0, sizeof(LmaScoreType) * kCodeBookSize);

  size_t freq_pos = 0;
  for (size_t code_pos = 0; code_pos < kCodeBookSize; code_pos++) {
    bool found = true;

    while (found) {
      found = false;
      double cand = freqs[freq_pos];
      for (size_t i = 0; i < code_pos; i++)
        if (freq_codes_df_[i] == cand) {
          found = true;
          break;
        }
      if (found)
        freq_pos++;
    }

    freq_codes_df_[code_pos] = freqs[freq_pos];
    freq_pos++;
  }

  myqsort(freq_codes_df_, kCodeBookSize, sizeof(double), comp_double);

  if (NULL == lma_freq_idx_)
    lma_freq_idx_ = new CODEBOOK_TYPE[idx_num_];
  assert(lma_freq_idx_);

  iterate_codes(freqs, idx_num_, freq_codes_df_, lma_freq_idx_);

  delete [] freqs;

  if (kPrintDebug0) {
    printf("\n------Language Model Unigram Codebook------\n");
  }

  for (size_t code_pos = 0; code_pos < kCodeBookSize; code_pos++) {
    double log_score = log(freq_codes_df_[code_pos]);
    float final_score = convert_psb_to_score(freq_codes_df_[code_pos]);
    if (kPrintDebug0) {
      printf("code:%ld, probability:%.9f, log score:%.3f, final score: %.3f\n",
             code_pos, freq_codes_df_[code_pos], log_score, final_score);
    }
    freq_codes_[code_pos] = static_cast<LmaScoreType>(final_score);
  }

  initialized_ = true;
  return true;
}