基本排序算法(冒泡法)
冒泡法时间复杂度:
最好情况:list内元素原本就是有序状态,此时无需移动元素,只需(n-1)次比较,时间复杂度为O(n);
最坏情况:list内元素全部为倒序排列,此时需要(n-1)趟排序,第i趟排序要进行(n-i)次元素对比,每次对比需要移动3次元素位置,时间复杂度为O();
平均情况:O();
空间复杂度:冒泡排序借助常数个辅助单元,故空间复杂度为O(1);
算法实现:
#include<stdio.h>
#此函数功能为输入一个常数n,接下来输入n个整型常量,函数将每次输入的n个整型常量由小到大排序。
int main(){
int n,flag;
int i,j;
void exchange(int *a, int *b);
int buffer[100];
while(scanf("%d",&n) != EOF){ // 此处使用的循环关闭条件,是为了能多次使用此函数功能,scanf()函数返回的值为:正确按指定格式输入变量的个数,当跳出循环时,ctrl+z即可。
for(i=0; i<n; i++){
scanf("%d",(buffer+i));
}
#冒泡算法核心部分
for(i=0; i<n; i++){ // 每趟排序
flag = 0; // 此趟排序是否有发生过元素交换,flag初始化为没有交换
for(j=n-1; j>0; j--){
if(buffer[j] < buffer[j-1]){ // 交换部分,发生交换则flag变为1
flag = 1;
exchange(buffer+j,buffer+j-1);
}
}
if(flag == 0){ // 未发生交换,代表list元素已经是有序,排序完成
break;
}
}
printf("The sorted list is:\r\n");
for(i=0; i<n; i++){
printf("%d ",buffer[i]);
}
}
}
#交换两个数的数值,使用指针传参
void exchange(int * a, int * b){
int temp = *a;
*a = *b;
*b = temp;
return;
}
排序算法是一个稳定的算法,每一趟排序,都会将一个元素放在其最终的位置上。