问一个关于快速排序的问题(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...被视频坑了!
#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和参考数就可以保证参考数左边比参考数小,右边大
我去你的我真正回答了问题竟然没有采纳。。。
交换了第一个数和中间的数,然后把第一个数做参考数的,因为你看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和参考数就可以保证参考数左边比参考数小,右边大
我去你的我真正回答了问题竟然没有采纳。。。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯