常用算法——冒泡法排序(Bubble Sort)
重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
冒泡排序是通过集合内相邻两个元素两两比较来排序的,每一次比较都是从位于集合内的前两个元素开始的,只不过每次需要比较的长度减1。如果比较两个元素相等,则不进行交换,冒泡排序是一种稳定排序。
第1次排序的比较次数:n-1 ,即n个元素相邻两两比较,需要n-1次比较;
第2次排序的比较次数:n-2,即第一次排序后最后一个元素可以确定为最大值,不再需要参与第二次排序;
第3次排序的比较次数:n-3 同理,最后两个数已经确定,不再需要参与排序;
第 n-1 次排序的比较次数:1 ;
总的比较次数为 (n-1) + (n-2) + (n-3) + …+1 = n*(n-1)/2 ,所以冒泡排序的时间复杂度是 O(n^2)。空间复杂度是 O(1) 。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//冒泡排序
void bubbleSort(int arr[ ], int length)
{
int temp;
for(int i =0;i<length-1;i++)
{
for(int j =0;j<length-i-1;j++)
{
if(arr[j]>arr[j+1])
{
temp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
//打印元素
void printArr(int arr[ ],int length)
{
for(int i=0;i<length;i++)
printf("%d\t",arr[i]);
printf("\n");
}
int main()
{
int arr[10]={3,5,2,10,8,9,6,4,7,1};
int length = sizeof(arr)/sizeof(int);
length = 10;
bubbleSort(arr,length);
printArr(arr,length);
return 0;
}
注:sizeof是C语言中保留关键字,也可以认为是一种运算符,单目运算符。sizeof的作用是获取数据在内存中所占用的存储空间,以字节为单位来计数。