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;

结果不对啊!但是也找不到哪里有错误!请各位帮我看下!谢谢!

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,开销大得很
参考技术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++冒泡排序法的主要内容,如果未能解决你的问题,请参考以下文章

冒泡法排序

C++实现冒泡排序和选择排序算法

编一个C++程序 创建一个选择排序法的函数模板sort 并在main()执行

C语言冒泡排序法

JavaScript的冒泡法排序选择法排序

算法大神之路----排序(冒泡排序法)