C++中的一维数组案例——排序算法
一、冒泡排序
1.思路(小到大)
如1,4,2,3,5,8,6,首先取数1,与后面的数比较,若比他小,位置不变,若比他大,往后挪一位;结束取数4与后面的数比较;循环往复。
2.复杂度
假设数组长度为n,计算量为:
(n-1)+(n-2)+···+1=(nx(n-1))/2
3.代码示例
#include <iostream>
using namespace std;
int main()
{
int array[9]={9,5,1,6,8,4,7,2,3};
cout<<"排序前的数组:";
for(int i=0;i<9;i++)
{
cout<<array[i]<<" ";
}
cout<<endl;
//排序
for(int i=0;i<9;i++)//打擂台九次
{
for(int j=0;j<8-i;j++)//每次打擂台
{
int temp=array[j];
if(array[j]>array[j+1])
{
array[j]=array[j+1];
array[j+1]=temp;
}
}
}
cout<<"排序后的数组:";
for(int i=0;i<9;i++)
{
cout<<array[i]<<" ";
}
cout<<endl;
return 0;
}
4.代码测试
5.优缺点
以时间换空间,数据多时,运行速度慢,但消耗内存空间少。
二、桶排序
1.思路
建立多个桶来统计每种数据出现次数,每一个桶对应一种数据,最后再输出。
2.复杂度
取决于桶数n。
3.代码示例
#include <iostream>
using namespace std;
int main()
{
int statics[10]={0};
cout<<"随机生成100个0~9的数:"<<endl;
for(int i=0;i<300;i++)
{
int num=rand()%10+0;
cout<<num<<" ";
switch (num)
{
case 0:statics[0]++;break;
case 1:statics[1]++;break;
case 2:statics[2]++;break;
case 3:statics[3]++;break;
case 4:statics[4]++;break;
case 5:statics[5]++;break;
case 6:statics[6]++;break;
case 7:statics[7]++;break;
case 8:statics[8]++;break;
case 9:statics[9]++;break;
default:cout<<"错误"<<endl;
}
}
cout<<endl;
for(int i=0;i<10;i++)
{
cout<<"数字"<<i<<"出现"<<statics[i]<<"次"<<endl;
}
for(int i=0;i<10;i++)
{
for(int j=0;j<statics[i];j++)
cout<<i<<" ";
}
cout<<endl;
return 0;
}
4.代码测试
5.优缺点
以空间换时间,运行速度快,但桶多时,占用内存多。