c++对9,1,8,2,7,3,6,4,5用二分法 排序成升序!求写法!求高人指教!~
答案:3 悬赏:20 手机版
解决时间 2021-01-09 19:44
- 提问者网友:雪舞兮
- 2021-01-09 13:36
c++对9,1,8,2,7,3,6,4,5用二分法 排序成升序!求写法!求高人指教!~
最佳答案
- 五星知识达人网友:三千妖杀
- 2021-01-09 14:11
快速排序法(即是二分排序)的思想是,找到一个值,要求这个值的左边都是小于等于这个值的,右边则大于等于这个值。
例如: int a[9]={9,1,8,2,7,3,6,4,5}
一步步演示如下:
设3个变量,i=0,j=8,fence=8 (都是下标)
i表示左边开始的元素9的下标,j表示最右边的元素5的下标,fence表示中间值的下标,初始为最右,即8。运作的时候i会往右靠,j会往左靠。
我们的目标是给数值5找一个合适的位置,让它满足上述条件。
1.i从0开始递增,每个数都和5比较,如果找到一个比5大的数,则和5交换位置。同时更新fence和i
执行后:a[9]={5,1,8,2,7,3,6,4,9} i = 1; fence = 0; (记住fence总是指示5所指的位置。)
2.j从8开始递减,每个数都和5比较,如果找到一个比5小的数,则和5交换位置。更新fence 和j
执行后:a[9]={4,1,8,2,7,3,6,5,9} j = 6; fence =7;
3.执行1的步骤:
执行后:a[9]={4,1,5,2,7,3,6,8,9} i =3 ; fence =2;
4.执行2的步骤
执行后:a[9]={4,1,3,2,7,5,6,8,9} j = 4 fence =5;
5.执行后a[9]={4,1,3,2,5,7,6,8,9} i = 5 fence =4;
至此判断 i已经大于j 中断循环 返回 fence的值,
那么经过一次排序后的结果就是a[9]={4,1,3,2,5,7,6,8,9}
5是选择的中间值,排在下标为4的位置
那么用递归对 下标为0到3,下标为5 到8 分别执行同样的排序就可以了。
这就是二分法的思想,即是快速排序。
代码如下:
#include#include
int partition(int *a, int l, int r){
int fence = r;
--r;
while(l<=r)
{
while(l<=r)
{
if(a[l]>a[fence])
{
std::swap(a[l],a[fence]);
fence = l;
++l;
break;
}
++l;
}
while(l<=r)
{
if(a[r] {
std::swap(a[r],a[fence]);
fence = r;
--r;
break;
}
--r;
}
}
return fence;
}
void quickSort(int *a, int l, int r){
if(l {
int p = partition(a,l,r);
quickSort(a,l,p-1);
quickSort(a,p+1,r);
}
}
int main()
{
int a[9]={9,1,8,2,7,3,6,4,5};
quickSort(a,0,8);
for(int i=0;i<9;++i)
std::cout<}
例如: int a[9]={9,1,8,2,7,3,6,4,5}
一步步演示如下:
设3个变量,i=0,j=8,fence=8 (都是下标)
i表示左边开始的元素9的下标,j表示最右边的元素5的下标,fence表示中间值的下标,初始为最右,即8。运作的时候i会往右靠,j会往左靠。
我们的目标是给数值5找一个合适的位置,让它满足上述条件。
1.i从0开始递增,每个数都和5比较,如果找到一个比5大的数,则和5交换位置。同时更新fence和i
执行后:a[9]={5,1,8,2,7,3,6,4,9} i = 1; fence = 0; (记住fence总是指示5所指的位置。)
2.j从8开始递减,每个数都和5比较,如果找到一个比5小的数,则和5交换位置。更新fence 和j
执行后:a[9]={4,1,8,2,7,3,6,5,9} j = 6; fence =7;
3.执行1的步骤:
执行后:a[9]={4,1,5,2,7,3,6,8,9} i =3 ; fence =2;
4.执行2的步骤
执行后:a[9]={4,1,3,2,7,5,6,8,9} j = 4 fence =5;
5.执行后a[9]={4,1,3,2,5,7,6,8,9} i = 5 fence =4;
至此判断 i已经大于j 中断循环 返回 fence的值,
那么经过一次排序后的结果就是a[9]={4,1,3,2,5,7,6,8,9}
5是选择的中间值,排在下标为4的位置
那么用递归对 下标为0到3,下标为5 到8 分别执行同样的排序就可以了。
这就是二分法的思想,即是快速排序。
代码如下:
#include
int partition(int *a, int l, int r){
int fence = r;
--r;
while(l<=r)
{
while(l<=r)
{
if(a[l]>a[fence])
{
std::swap(a[l],a[fence]);
fence = l;
++l;
break;
}
++l;
}
while(l<=r)
{
if(a[r] {
std::swap(a[r],a[fence]);
fence = r;
--r;
break;
}
--r;
}
}
return fence;
}
void quickSort(int *a, int l, int r){
if(l
int p = partition(a,l,r);
quickSort(a,l,p-1);
quickSort(a,p+1,r);
}
}
int main()
{
int a[9]={9,1,8,2,7,3,6,4,5};
quickSort(a,0,8);
for(int i=0;i<9;++i)
std::cout<}
全部回答
- 1楼网友:千杯敬自由
- 2021-01-09 16:10
冒泡排序
#include
void main()
{
int a[10]={0,1,2,3,4,5,6,7,8,9};
int i,j,tmp;
for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
if(a[j]>a[j+1])
{
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
printf("the sorted numbers:\n");
for(i=0;i<10;i++)
printf("%d",a[i]);
printf("\n");
}
#include
void main()
{
int a[10]={0,1,2,3,4,5,6,7,8,9};
int i,j,tmp;
for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
if(a[j]>a[j+1])
{
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
printf("the sorted numbers:\n");
for(i=0;i<10;i++)
printf("%d",a[i]);
printf("\n");
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯