冒泡排序
每一轮两两之间比较,选出最大或最小值放末尾
整体比较轮次数:length - 1 轮
j < length - 1 - i 含义:每过一轮最后一个数就不用比较,就是比较的数减少一个。一轮后减一,二轮后减二,i - 1轮后减i - 1
时间复杂度:O(n²)
n个记录,第i轮需要比较n-i次,总共需要n-1轮
void BubbleSort(int a[], int length) {
//升序排序,每次选出最大的数排在末尾
for (int i = 0; i < length - 1; i++) {//总共比较的轮次 length - 1次
for (int j = 0; j < length - 1 - i; j++) {//每一轮比较的次数
if (a[j] > a[j + 1]) {
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
//降序排序,每次选出最小的数排在末尾
for (int i = 0; i < length - 1; i++) {//总共比较的轮次 length - 1次
for (int j = 0; j < length - 1 - i; j++) {//每一轮比较的次数
if (a[j] < a[j + 1]) {
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;升
}
}
}
}
int main()
{
int a[6] = {3,2,4,6,1,5};
int length = sizeof(a) / sizeof(int);
BubbleSort(a,length);
for (int i = 0; i < length; i++)
{
printf("%d", a[i]);
}
return 0;
}
改进
如果在某一趟没有出现数据交换,就说明已经是排序好的,那么后面的循环就不需要再执行了。
设置一个flag变量,确定是否退出循环。
void BubbleSort(int a[],int length){
int flag = 1;//flag=0就说明本轮没有进行交换,循环结束
for(int i = 0; i < length - 1 && flag == 1; i++){//总共比较的轮次 i次
flag = 0;
for(int j = 0; j < length - 1 - i; j++){//每一轮比较的次数
if(a[j] > a[j + 1]){
flag = 1;//交换一次置位1
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
}