算法之冒泡排序

                                               冒泡排序   

题目描述

查找和排序

题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
      都按先录入排列在前的规则处理。

   例示:
   jack      70
   peter     96
   Tom       70
   smith     67

   从高到低  成绩            
   peter     96    
   jack      70    
   Tom       70    
   smith     67    

   从低到高

   smith     67  

   jack       70    
   Tom      70    
   peter     96      

输入描述:

输入多行,先输入要排序的人的个数,然后输入排序方法0(降序)或者1(升序)再分别输入他们的名字和成绩,以一个空格隔开

输出描述:

按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开

示例1

输入

3
0
fang 90
yang 50
ning 70

输出

fang 90
ning 70
yang 50


#include<stdio.h>
#include<string.h>
struct node{
  char name[20];
  int score;
};
int flag;
struct node *BubleSort(struct node student[],int n){
  char name[20];
  for(int i=0;i<n;i++){
     for (int j=0;j<n-i-1;j++){
       if(student[j].score>student[j+1].score&&flag==1){     //升序
         int score=student[j+1].score;
         strcpy(name,student[j+1].name);
         student[j+1].score=student[j].score;
         strcpy(student[j+1].name,student[j].name);
         student[j].score=score;
         strcpy(student[j].name,name);
       }
       else if(student[j].score<student[j+1].score&&flag==0){  //降序
       	 int score=student[j+1].score;
         strcpy(name,student[j+1].name);
         student[j+1].score=student[j].score;
         strcpy(student[j+1].name,student[j].name);
         student[j].score=score;
         strcpy(student[j].name,name);
	   }
     }
  }
    return student;
}
int main(){
  struct node student[100];
  struct node *result;
  int n;
  while(scanf("%d%d",&n,&flag)!=EOF){
  for(int i=0;i<n;i++){
    scanf("%s%d",student[i].name,&student[i].score);
  }
  result=BubleSort(student,n);
  for(int i=0;i<n;i++){
    printf("%s %d\n",result[i].name,result[i].score);
     }
  }
  return 0;
}

时间复杂度

       若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数 和记录移动次数  均达到最小值:  , 。所以,冒泡排序最好的时间复杂度为 

       若初始文件是反序的,需要进行  趟排序。每趟排序要进行  次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:

                                           

冒泡排序的最坏时间复杂度为  。综上,因此冒泡排序总的平均时间复杂度为  

算法稳定性

        冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素,当两个元素相等时,元素的位置不会发生改变,故冒泡算法是一种稳定的算法。


猜你喜欢

转载自blog.csdn.net/douzhenwen/article/details/79808742