您的位置:首页 > 其它

给定数组,查找最小的k个元素或最大的k个元素 快速排序算法灵活应用

2012-04-04 23:33 369 查看
假定有这样一组数列 { 10, 33, 2, 4, 55, 6, 12, 34, 456, 66, 43, 23, 65, 1, 345, 61, 76, 31, 43, 76 };

如和求出最小的k个值,或最大的k个值?

借鉴快速排序算法,下面是本科教材《数据结构》中的快速排序:

void QuickSort ( int A[ ], int head, int rear )
{
  int pivot;
  if( head < rear )  // 肯定为真的条件
  {
    pivot = Partition ( A, head, rear );
    QuickSort( A, head, pivot-1 );
    QuickSort( A, pivot+1, rear );
  }
}

int Partition ( int A[ ], int left, int right )  //这是左大右小的排序
{
  int pivot = A[ left ];
  while( left < right )
  {
    while( right > left && A[ right ] >= tem )
      right--;
    A[ left ] = A[ right ];
    while( left < right && A[ left ] <= tem )
      left++;
    A[ right ] = A[ left ];
  }
  A[ left ] = tem;
  return left;  //最后left=right,所以返回哪个都一样
}


下面稍作修改,改为仅把最小的K个元素放在前k个位置上:

void QuickSearch( int A[], int head, int rear, int k )
{
  int pivot;
  if ( head < rear )  //肯定为真的条件
  {
    pivot = partition( A, head, rear );
    if( piovt < K )
      QuickSearch( A, pivot-1, rear, int K-pivot );
    if( pivot > k )
      QuickSearch( A, head, pivot-1, int K );      
  }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐