c++冒泡排序法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++冒泡排序法相关的知识,希望对你有一定的参考价值。
#include<iostream>
using namespace std;
int main()
int t,a[]=432,344,234,567,86,123,987,213,568,423;
const int SIZE=(sizeof(a)/sizeof(a[0]));
for(int i=0;i<SIZE;i++)
for(int j=0;j<SIZE-i;j++)
if(a[j]>a[j+1])
t=a[i];
a[i]=a[j];
a[j]=t;
for(i=0;i<SIZE;i++)
cout<<a[i]<<' ';
cout<<endl;
return 0;
结果不对啊!但是也找不到哪里有错误!请各位帮我看下!谢谢!
这里a[]有10个元素,即SIZE=10;
首先说一下冒泡排序法的思想:设为降序排序a[0]>a[1]>.....
1.a[]是一个无序的序列。如果a[]是已经降序排序好的,我们也设为无序,即
它作为一个序列参数,人可以看出他是有序的,但程序把它作为参数,要
经过冒泡排序,程序才能认为得到的结果序列是一个有序的序列。
2.选出序列中第一大元素作为a[0]:
3.原序列分为两个子序列:a[0]子序列有序,a[1]...a[n]无序
4.在无序的子序列a[1]...a[n]中选出最大元素作为a[1],将a[1]加入有序子
序列中,形成a[0]>a[1]
5.重复2 3 4
你的程序中排序部分有问题:
for(int i=0;i<SIZE;i++)
for(int j=0;j<SIZE-i;j++)//j=0也无妨,但是重复比较了一次,j=1
if(a[j]>a[j+1]) //这个比较条件有问题,设i=0,j=1,a[j]与a[j+1]的
//大小关系与a[i]有什么关系呢
t=a[i];
a[i]=a[j];
a[j]=t;
////////////改为///////////////////////
for(int i=0;i<SIZE;i++)
for(int j=i+1;j<SIZE;j++)
if(a[j]>a[i])
t=a[i];
a[i]=a[j];
a[j]=t;
但是这种比较太频繁,开销太大
这是我个人自己写的哟,请给我分啊
///////////////////////
for(int i=SIZE-1;i>0;i--)
for(int j=0;j<i;j++)
if(a[j]>a[j+1])
int t;
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
说一下楼上的,j++一次就定义一次int t;又删除一次t,开销大得很 参考技术A const
int
SIZE=(sizeof(a)/sizeof(a[0]));这句是对的,错的是你的排序体
这里a[]有10个元素,即SIZE=10;
首先说一下冒泡排序法的思想:设为降序排序a[0]>a[1]>.....
1.a[]是一个无序的序列。如果a[]是已经降序排序好的,我们也设为无序,即
它作为一个序列参数,人可以看出他是有序的,但程序把它作为参数,要
经过冒泡排序,程序才能认为得到的结果序列是一个有序的序列。
2.选出序列中第一大元素作为a[0]:
3.原序列分为两个子序列:a[0]子序列有序,a[1]...a[n]无序
4.在无序的子序列a[1]...a[n]中选出最大元素作为a[1],将a[1]加入有序子
序列中,形成a[0]>a[1]
5.重复2
3
4
你的程序中排序部分有问题:
for(int
i=0;i<SIZE;i++)
for(int
j=0;j<SIZE-i;j++)//j=0也无妨,但是重复比较了一次,j=1
if(a[j]>a[j+1])
//这个比较条件有问题,设i=0,j=1,a[j]与a[j+1]的
//大小关系与a[i]有什么关系呢
t=a[i];
a[i]=a[j];
a[j]=t;
////////////改为///////////////////////
for(int
i=0;i<SIZE;i++)
for(int
j=i+1;j<SIZE;j++)
if(a[j]>a[i])
t=a[i];
a[i]=a[j];
a[j]=t;
但是这种比较太频繁,开销太大
这是我个人自己写的哟,请给我分啊
///////////////////////
for(int
i=SIZE-1;i>0;i--)
for(int
j=0;j<i;j++)
if(a[j]>a[j+1])
int
t;
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
说一下楼上的,j++一次就定义一次int
t;又删除一次t,开销大得很 参考技术B 问题出在这
if(a[j]>a[j+1])
t=a[i];
a[i]=a[j];
a[j]=t;
应改为:
if(a[j]>a[j+1])
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
另外还有一处问题:for(int j=0;j<SIZE-i;j++)
if(a[j]>a[j+1])
当i=0时,j=SIZE-1时,a[j]>a[j+1],此时j+1=SIZE,数组访问越界了!!!
所以应改为:for(int j=0;j<SIZE-i-1;j++)
运行结果:
86 123 213 234 344 423 432 567 568 987
Press any key to continue 参考技术C 你太多地方错误,我调试完毕,是从小到大排,如果要相反你自己应该会了吧:
#include<iostream>
using namespace std;
int main()
int a[]=432,344,234,567,86,123,987,213,568,423;
int SIZE=(sizeof(a)/sizeof(a[0]));
for(int i=SIZE-1;i>0;i--)
for(int j=0;j<i;j++)
if(a[j]>a[j+1])
int t;
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
for(i=0;i<SIZE;i++)
cout<<a[i]<<' ';
cout<<endl;
return 0;
参考技术D 第二个for循环作用
第一次结束后将最大的数放置最后
第二次结束后将第二大数放到倒数第二的位置
以此类推
相应的
循环的次数应该越来越少
因为大数逐渐排列好了
所以j<9-i 还有啊
c++
#include
<iostream>
打印a[i]的for循环拿出来
编一个C++程序 创建一个选择排序法的函数模板sort 并在main()执行
如题 .
参考技术A 写了两段代码,第一个是用冒泡排序法做的,第二个是快速排序法#include <iostream>
using namespace std;
//冒泡排序法
template<typename T>
void sort(T *data, int n)
int i, j;
T hold;
for (i = 0; i < n - 1; i++)
for (j = 0; j < n -1; j++)
if (data[j] > data[j+1])
hold = data[j];
data[j] = data[j+1];
data[j+1] = hold;
int main()
int i;
int a[] = 3, 2, 1, 5, 8 ,7;
char b[] = 'b', 'c', 'a', 'p', 'g';
double c[] = 1.2, 2.1, 1.1, 1.0;
sort(a, 6);
for (i = 0; i < 6; i++)
cout << a[i] << " ";
cout << endl;
sort(b, 5);
for (i = 0; i < 5; i++)
cout << b[i] << " ";
cout << endl;
sort(c, 4);
for (i = 0; i < 4; i++)
cout << c[i] << " ";
cout << endl;
return 0;
#include <iostream>
using namespace std;
//快速排序法
template<typename T>
void Quick_sort(T *data_ptr, int left, int right)
int low(left), high(right);
T middle, temp;
middle = data_ptr[(rand()%(right - left + 1)) + left]; //随机产生一个大于等于left且小于等于right的数
do
while ((data_ptr[low] < middle) && (low < right)) //左扫面找出大于middle的数
low++;
while ((data_ptr[high]) > middle && (high > left)) //右扫面找出小于middle的数
high--;
//数据交换
if (low <= high)
temp = data_ptr[low];
data_ptr[low] = data_ptr[high];
data_ptr[high] = temp;
low++;
high--;
while(low <= high); //当下标交错时停止,结束一次排序
//当左边有部分值的时候(left<high),递归左边
if (left < high)
Quick_sort(data_ptr, left, high);
//当右边有部分值的时候(right > low),递归右边
if (right > low)
Quick_sort(data_ptr, low, right);
int main()
int i;
int a[] = 3, 2, 1, 5, 8 ,7;
char b[] = 'b', 'c', 'a', 'p', 'g';
double c[] = 1.2, 2.1, 1.1, 1.0;
Quick_sort(a, 0, 5);
for (i = 0; i < 6; i++)
cout << a[i] << " ";
cout << endl;
Quick_sort(b, 0, 4);
for (i = 0; i < 5; i++)
cout << b[i] << " ";
cout << endl;
Quick_sort(c, 0, 3);
for (i = 0; i < 4; i++)
cout << c[i] << " ";
cout << endl;
return 0;
本回答被提问者和网友采纳
以上是关于c++冒泡排序法的主要内容,如果未能解决你的问题,请参考以下文章