分治法众数

来源:互联网 发布:westvleteren 12 淘宝 编辑:程序博客网 时间:2024/04/30 11:20
1. 分治法求众数重数问题基本描述
分治法众数
2. 方法简述
    修改快排:

    1、取轴值x,根据快排的过程,小于x的放在左边,大于x的放在右边。同时统计x的出现次数T。

   2、如果X左边的个数(不算X)多于T,向左递归;同理,如果X右边的个数对于T,向右递归。

3. c代码的实现



#include
#include

void swap(int *a, int *b)
{
   int    tmp;
    tmp = *a; *a= *b; *b = tmp;
}


void k_sort (int *arr, int left, int right, int *z_n, int*c_n)
{
   int    i = left+1, j = right, key, temp, cnt = 0;

    if (left>= right)
       return;

    key =arr[left];
    while (1){
       while (arr[j] > key) j--;
       if (arr[j] == key) cnt++;

       while (arr[i] < key && i < j) i++;
       if (arr[i] == key) cnt++;

       if (i >= j) break;

       swap (&arr[i], &arr[j]);
       if (arr[i] == key) {
           j--;
           cnt--;
       }
       else {
           i++;
           if (arr[j] == key) cnt--;
       }
       
    }

    if (*c_n< cnt) {
       *z_n = key;
       *c_n = cnt;
    }

    swap(&arr[left], &arr[j]);


    if ((j -left) > cnt)
       k_sort (arr, left, i-1, z_n, c_n);
    if ((right -j) > cnt)
       k_sort (arr, j+1, right, z_n, c_n);


}

int zhongshu_chongshu (int *arr, int cnt, int *z_n, int *c_n)
{
   int    i;

    *c_n =-1;
    k_sort (arr,0, cnt-1, z_n, c_n);
}

int main (int argc, char **argv)
{
    if (argc !=3) {
       printf ("arguments error!\n");
    }

   int    *arr, cnt, i, z_n, c_n;
   FILE   *fp;

    if ((fp =fopen (argv[1], "r")) < 0) {
       perror ("open file");
       exit (EXIT_FAILURE);
    }

    if (fscanf(fp, "%d", &cnt) < 0) {
       fclose (fp);
       perror ("read cnt");
       exit (EXIT_FAILURE);
    }
    arr = (int*)malloc (cnt * sizeof (int));
    for (i = 0;i < cnt; i++)
       if (fscanf (fp, "%d", &arr[i]) < 0) {
           fclose (fp);
           perror ("read data");
           exit (EXIT_FAILURE);
       }
    fclose(fp);
   
   zhongshu_chongshu (arr, cnt, &z_n, &c_n);

    if ((fp =fopen (argv[2], "w")) < 0) {
       perror ("open file");
       exit (EXIT_FAILURE);
    }
    if (fprintf(fp, "%d\n%d", z_n, c_n) < 0) {
       fclose (fp);
       perror ("write file");
       exit (EXIT_FAILURE);
    }
    fclose(fp);

    returnEXIT_SUCCESS;
}

原创粉丝点击