永发信息网

问一个关于快速排序的问题(C语言)

答案:3  悬赏:20  手机版
解决时间 2021-12-03 01:26
  • 提问者网友:听门外雪花风
  • 2021-12-02 01:40
问一个关于快速排序的问题(C语言)
最佳答案
  • 五星知识达人网友:怙棘
  • 2021-12-02 02:37
#include 
#include 
using std::cout;
using std::endl;
template< typename TYPE >
void Swap( TYPE * a, TYPE * b )
{
 TYPE temp;
 temp = * a;
 * a = * b;
 * b = temp;
}
template< typename TYPE >
void OutPut( TYPE * Num, int NumMaxLength )
{
 for( int i = 0; i < NumMaxLength; i++ )
 {
  cout << Num[i] << " ";
 }
 cout << endl;
}
//快速排序: 假设取第一个数作为分界, 进行一趟快速排序后,小于分界的数字位于分解左边 大于分界的数字位于分界右边
//   然后对分界左边的和右边的数组在进行快速排序 直到数组被分割为只剩下一个数字
template< typename TYPE >
void QuickSort1( TYPE * Num, int left, int right )  //left和right为数组的上界和下界( left即为0,right为数组的长度 )
{               //此时 Num[right]为;
 int i, j; 
 if( left < right )         //若数组的下界小于上界 代表数组至少还有两个元素 继续排序
 {
  i = left;           //使i成为指向下界位置的指针 现在指向了Num[0] - 分界元素
  j = right;          //使j成为指向上界位置的指针 现在指向了Num[n] - 数组
  do             //当 i < j 时继续循环, i >= j时 数组已经满足要求
  {
   do i++;
   while( Num[i] < Num[left] );   //从左往右 找到第一个小于分界的数字;
   do j--;
   while( Num[j] > Num[left] );   //从右往左 找到第一个大于分界的数字
   if( i < j )          //如果此时 i < j 则交换两个数字
   {
    Swap( & Num[i], & Num[j] );
   }
  }
  while( i < j );         //当i < j时 结束循环 此时 j + 1 = i; 
               //( i != j; 因为这个数字不可能又比分界大 又比分界小 )
               // 此时j的位置为最小组的最后一位,i的位置为最大组的第一位
  Swap( & Num[left], & Num[j] );   // 交换分界和最小组的最后一位
               //分为最小组和最大组 left -> Num[j-1] -> Num[j] -> Num[j+1] -> right
  QuickSort1( Num, left, j - 1 );   //Num[j]现在即为分界元素 
  QuickSort1( Num, j + 1, right );   //分别对最大组和最小组进行快速排序
 }
}

int main()
{
 int Num[] = { 5, 8, 9, 5, 1, 5 };
 QuickSort1( Num, 0, 6 );
 OutPut( Num, 6 );
 system( "pause" );
 return 0;
}你慢慢研究吧
追问我希望能解决我的问题。。不是重新给我一个模板,毕竟快排模板太多,甚至我可以调用库函数调用STL追答你运行一下你的程序能排出序来 ? 我排出来是 115725839 ..,. 你拿着一个不能排出序的程序在研究排序 ?追问wctmlgdxb...被视频坑了!
全部回答
  • 1楼网友:空山清雨
  • 2021-12-02 04:19
可以调用啊,第一个参数是你准备要排序的数组,第二个参数是你准备从那个地方开始排,第三个指你在哪里结尾
请采纳答案,支持我一下。追问...
  • 2楼网友:持酒劝斜阳
  • 2021-12-02 03:10
写的好麻烦的快排。。。确定效率很高?
交换了第一个数和中间的数,然后把第一个数做参考数的,因为你看left指针没有动到
然后i指针开始走,每走到一个比参考数大的就把last下标加1并且交换last和i的数、、为什么这么写不知道。。。
这样难道能使得last左边的数绝对比last小,右边的数绝对比last大吗。。没运行不知道
还有(left+right)>>2就是(left+right)/2,就是取从左边到右边的中间那个数。。追问这样能用的。。。这个是 《 The C programming language 》 上的啊追答卧槽。。楼主看这么牛逼的书233
向C语言之父问好

动手排了一下,很简单
首先从left+1下标向右看起
last左边的绝对比参考数小(初始左边没有数,我说了是从left+1看起的),然后i指针向左走,走到遇见比参考数小的就堆积到last指针那里。。。这样一趟走完所有比参考数小的都放在last左边了,只要交换last和参考数就可以保证参考数左边比参考数小,右边大

我去你的我真正回答了问题竟然没有采纳。。。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯