您的位置:首页 > 理论基础 > 数据结构算法

考研数据结构与算法之排序专题二 冒泡排序及优化

2015-01-31 22:20 246 查看
冒泡排序顾名思义就是由于在排序过程中总是小数往前放,大数往后放,相当于气泡上升。

基本思想:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。然后从头开始比较,比较n-2次,第二次结束,重复以上操作

至排序结束。

测试谭浩强版冒泡排序(B_S_Tan)对随机生成的10000个数的数组进行排序所用时间为0.974s(每次运行所需时间不同)

优化后的冒泡排序(B_S_Op)随机生成100 000个数的数组进行排序所用时间仅为 0.004s(每次运行所需时间较大不同)

设置一个flag个标志,如果这一趟排序发生了交换,则将flag置为true,否则为flase,显然如果一趟排序没有发生交换则说明数组已排好序。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define bool int
#define true 1
#define false 0
#define SIZE 100000

void B_S(int s[], int n){
int i,pos,j,temp;
for ( i = 0; i < n; i++){
pos = 1;
for (j = 0; j < n-i-1; j++){
if (s[j] > s[j + 1]){
temp = s[j];
s[j] = s[j + 1];
s[j + 1] = temp;
pos = 0;
}
}
if (pos)
return;
}
}
void B_S_Tan(int s[],int n)
{
int i,j,temp;
for(j=0;j<n-1;j++)
{
for(i=0;i<n-1-j;i++)
{
if(s[i]>s[i+1])
{
temp=s[i];
s[i]=s[i+1];
s[i+1]=temp;
}
}
}
printf("the sorted numbers:\n");
}
void B_S_Op(int s[], int n)
{
int j, k,temp;
bool flag;

k = n;
flag = true;
while (flag)
{
flag = false;
for (j = 1; j < k; j++)
if (s[j - 1] > s[j])
{
temp=s[j];
s[j]=s[j-1];
s[j-1]=s[j];
flag = true;
}
k--;
}
}

int main(int argc, char *argv[]){
int s[SIZE];
int i;
clock_t start, finish;
double Total_time;
for (i = 0; i < SIZE; i++){
s[i] = rand() % 100;
}
start = clock();
B_S_Op(s,SIZE);
//B_S_Tan(s, SIZE);
//B_S(s,SIZE);
finish = clock();
Total_time = (double)(finish - start) / CLOCKS_PER_SEC;
printf("%d个数的运行时间为%.3f\n", SIZE, Total_time);
/*for (i = 0; i < SIZE; i++)
printf("%d ", s[i]);*/
printf("\n");
system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: