不知道错哪里
我的测试数据:
输入
3
5 1 4
输出
错误(就是我的)
1 5 4
正确
1 4 5
代码:
#include<iostream>
#include<cstdio>
using namespace std;
void L_Swap(int &a,int &b)
{
/*交换ab值*/
int S=a;
a=b;
b=S; //交换
}
void L_Sort(int a[],int Begin,int End)
{
/*二分查找函数*/
if(Begin>=End) //如果没有排序对象,跳过
{
return;
}
else //否则排序
{
int Mid=a[(Begin+End)/2],i=Begin,j=End; //定义函数
while(i<j)
{
while(a[i]<Mid && i<j) //查找左边的违规数
{
i++;
}
while(a[j]>Mid && i<j) //查找右边的违规数
{
j--;
}
L_Swap(a[i],a[j]); //交换两方违规数
}
L_Sort(a,Begin,Mid-1); //继续进行左侧排序
L_Sort(a,Mid+1,End); //继续进行右侧排序
}
}
int a[1001];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
L_Sort(a,0,n-1);
for(int i=0;i<n;i++)
{
cout<<a[i]<<' ';
}
}
答案参考ChatGPT ,如果有参考价值麻烦采纳一下,谢谢啦!!_
在L_Sort函数中计算Mid的表达式错误,应该是Mid=a[(Begin+End)/2],而不是Mid=a[Begin+End/2],因为加法优先级高于除法。
在L_Sort函数中,快速排序的分割点应该是Mid,而不是a[(Begin+End)/2],因为Mid是分割点的值。应该将while循环结束后,Mid和a[j]交换位置,以保证Mid作为分割点的值正确。
在while循环中,第二个while条件应该是a[j]>=Mid,而不是a[j]>Mid,因为当a[j]==Mid时,也应该停止查找。
在L_Sort函数递归调用时,应该将Mid-1和Mid+1传入,而不是Begin和End,因为Mid是分割点,不应该重复排序。
下面是修改后的代码:
```c
#include<iostream>
#include<cstdio>
using namespace std;
void L_Swap(int &a, int &b)
{
int S = a;
a = b;
b = S;
}
void L_Sort(int a[], int Begin, int End)
{
if(Begin >= End)
{
return;
}
else
{
int Mid = a[(Begin+End)/2];
int i = Begin, j = End;
while(i < j)
{
while(a[i] < Mid && i < j)
{
i++;
}
while(a[j] >= Mid && i < j)
{
j--;
}
L_Swap(a[i], a[j]);
}
L_Swap(a[j], a[(Begin+End)/2]);
L_Sort(a, Begin, j-1);
L_Sort(a, j+1, End);
}
}
int a[1001];
int main()
{
int n;
cin >> n;
for(int i = 0; i < n; i++)
{
cin >> a[i];
}
L_Sort(a, 0, n-1);
for(int i = 0; i < n; i++)
{
cout << a[i] << ' ';
}
return 0;
}
```
你这跟 二分查找没多大关系吧,这是 二分排序吧
修改如下:
#include<iostream>
#include<cstdio>
using namespace std;
void L_Swap(int &a,int &b)
{
/*交换ab值*/
int S=a;
a=b;
b=S; //交换
}
void L_Sort(int a[],int Begin,int End)
{
/*二分查找函数*/
if(Begin>=End) //如果没有排序对象,跳过
{
return;
}
else //否则排序
{
int Mid = (Begin + End) / 2;
if(a[Begin] > a[Mid]) L_Swap(a[Begin], a[Mid]);
if(a[Begin] > a[End]) L_Swap(a[Begin], a[End]);
if(a[Mid] > a[End]) L_Swap(a[Mid], a[End]);
int i=Begin,j=End;
int pivot = a[Begin];
while(i<j)
{
while(a[j]>=pivot && i<j) j--;
a[i] = a[j];
while(a[i]<=pivot && i<j) i++;
a[j] = a[i];
}
a[i] = pivot;
L_Sort(a,Begin,i-1);
L_Sort(a,i+1,End);
}
}
int a[1001];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
L_Sort(a,0,n-1);
for(int i=0;i<n;i++)
{
cout<<a[i]<<' ';
}
return 0;
}
void Swap(int* p1, int* p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
void BubbleSort(int* a, int n)
{
assert(a);
for (int i = 0; i < n; i++)
{
int exchange = 0;
for (int j = 1; j < n - i; j++)
{
if (a[j - 1] > a[j])//大于排升序 小于排降序
{
Swap(&a[j - 1], &a[j]);
exchange = 1;
}
}
if (exchange == 0)
{
break;
}
}
}
优化步骤:设置一个标志位exchange,在外重循环赋初值0,在内层循环,遍历一趟若有交换操作,则赋值1,否则不改变exchange的值。如此操作一次后对exchange进行判断,若无改变则说明序列已经有序,结束算法。