永发信息网

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

答案:3  悬赏:20  手机版
解决时间 2021-12-03 01:26
问一个关于快速排序的问题(C语言)
最佳答案
#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...被视频坑了!
全部回答
可以调用啊,第一个参数是你准备要排序的数组,第二个参数是你准备从那个地方开始排,第三个指你在哪里结尾
请采纳答案,支持我一下。追问...
写的好麻烦的快排。。。确定效率很高?
交换了第一个数和中间的数,然后把第一个数做参考数的,因为你看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和参考数就可以保证参考数左边比参考数小,右边大

我去你的我真正回答了问题竟然没有采纳。。。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
穿云裂帛是什么意思?
你好,我最近打算去牯牛降,带一个小孩子,请
太仓巿朝阳车站到上海浦东新区顾路镇坐什么车
银行承兑汇票上的付款方行号和地址没填写有没
非法倒卖土地获得暴利1000万的判多少年
圆可以剪拼成一个近似的长方形,该长方形的长
用来油铁的油漆有水性的吗?
Java语言中怎样表达如果是
一轮明月满乾坤是什么意思?
教授是什么都懂吗?
原价除以什么等于现价
单选题人们常说“病从口入”,是指哪一类传染
跪求鸽子情缘歌词粤语谐音的?
你就那么好啊,你太伤我心是什么意思
沈阳夜未央28日当天晚上要门票吗?多少钱?开桌
推荐资讯
电脑从win7旗舰版如何升级为win8
购房须知:刚需置业切勿踏入这五大误区
眼部受伤吃什么好
布达拉宫怎么的作文怎么写当导游的事情哦
三亚到育才镇怎么走(公交)
请问丽颜风暴评价怎么样?信得过吗
游戏鼠标,分别接USB3.0接口上面,相对USB2.0
西门子S7-200 224XP做从站与上位机MODBUS通讯
谁有电镀厂的人脉资源
周家凉皮店的凉皮好不好吃
西亚著名的灌溉农业区是A.恒河平原B.土兰平原
佳能700d怎么看快门次数
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?