Chinaunix首页 | 论坛 | 博客
  • 博客访问: 350918
  • 博文数量: 63
  • 博客积分: 1412
  • 博客等级: 中尉
  • 技术积分: 648
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-10 23:07
文章分类

全部博文(63)

文章存档

2012年(42)

2011年(21)

我的朋友

分类: C/C++

2012-03-26 16:01:04

今天写了下看快排,以及快排的应用-找第K小的数字。
发现想法和实现真有距离。
写了好半天,才把快排和找第K小的程序写正确。
 
几个值得注意的问题:
1)一定要对输入参数进行合法性判断。
2)递推调用一定要有终止条件判断。
3)多动手写程序吧。
 

点击(此处)折叠或打开

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>

  5. using namespace std;
  6. void swap( int *data, int first, int second );
  7. void b_search( int *data, int low, int high );
  8. int partition( int *data, int low, int high );
  9. void print_( int *data, int low, int high );

  10. #define LEN 100

  11. int    main()
  12. {
  13.     int data[LEN];
  14.     int n = 0;

  15.     memset( data, 0x00, sizeof(data) );

  16.     scanf( "%d", &n );
  17.     if( n >= LEN )
  18.     {
  19.         printf( "input error\n" );
  20.         return 1;
  21.     }

  22.     for( int i=0; i<n; i++ )
  23.     {
  24.         scanf( "%d", &data[i] );
  25.     }

  26.     b_search( data, 0, n-1 );

  27.     print_( data, 0, n-1 );
  28. }

  29. //快排
  30. void b_search( int *data, int low, int high )
  31. {
  32.     int cur = 0;
  33.     //关键是这块要判断low和high
  34.     if( low < high )
  35.     {
  36.         cur = partition( data, low, high );

  37. ///        print_( data, low, high );
  38.         b_search( data, low, cur-1 );
  39.     
  40.         b_search( data, cur+1, high );
  41.     }
  42. }

  43. int partition( int *data, int low, int high )
  44. {
  45.     int cur = low;
  46.     int key = data[cur];

  47.     if( data == NULL || low == high || low > high )
  48.     {
  49.         return 0;
  50.     }

  51.     while( low < high )
  52.     {
  53.         //一定要注意相等的情况
  54.         while( low < high && data[high] >= key )
  55.         {
  56.             high--;
  57.         }
  58.         if( low < high )
  59.         {
  60.             //printf( "cur=[%d],high=[%d]\n", cur, high );
  61.             swap( data, cur, high );
  62.             cur = high;
  63.         }

  64.         while( low < high && data[low] <= key )
  65.         {
  66.             low++;
  67.         }
  68.         if( low < high )
  69.         {
  70.             //printf( "cur=[%d],high=[%d]\n", cur, high );
  71.             swap( data, cur, low );
  72.             cur = low;
  73.         }    
  74.     }

  75. //    data[low] = key;

  76.     return low;
  77. }

  78. void swap( int *data, int first, int second )
  79. {
  80.     int tmp = 0;
  81.     tmp = data[first];

  82.     data[first] = data[second];
  83.     data[second] = tmp;
  84. }

  85. void print_( int *data, int low, int high )
  86. {
  87.     int i = 0;
  88.     for( int i=low; i<=high; i++ )
  89.     {
  90.         printf( "%d ", data[i] );
  91.     }
  92.     printf( "\n" );
  93. }

阅读(1576) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~