冒泡排序
动图
方法一:(双层循环)
#include <stdio.h>
int main()
{
int arr[10]={23,43,12,32,61,12,49,11,78,2},i,j,t;
//需要排序n-1次就可出结果
for(i=10-1;i>0;i--){
//每次比较0到i之间的元素
for(j=0;j<i;j++){
if(arr[j]>arr[j+1]){
t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
}
}
for(i=0;i<10;i++) printf("%4d",arr[i]);
return 0;
}
方法二:采用递归(单层循环)
#include <stdio.h>
void bubbleSort(int arr[],int n);
int main()
{
int arr[10]={23,43,12,32,61,12,49,11,78,2},i,j,t;
bubbleSort(arr,10);
for(i=0;i<10;i++) printf("%4d",arr[i]);
return 0;
}
void bubbleSort(int arr[],int n){
int i,t;
if(n<2) return;
for(i=0;i<n-1;i++){
if(arr[i]>arr[i+1]){
t=arr[i];
arr[i]=arr[i+1];
arr[i+1]=t;
}
}
bubbleSort(arr,--n);
}
优化冒泡
原因:当数组已经有序,就可以提前结束循环
#include <stdio.h>
int main()
{
int arr[10]={2,3,43,12,32,61,12,49,11,78},i,j,t;
int ifswap=0;
//需要排序n-1次就可出结果
for(i=10-1;i>0;i--){
printf("%d",i);
//每次比较0到i之间的元素
ifswap=0;//初始化交换标识
for(j=0;j<i;j++){
if(arr[j]>arr[j+1]){
t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
ifswap=1;
}
}
//如果在0到i之间没有进行交换,说明已经排序完成
if(ifswap==0) break;
}
for(i=0;i<10;i++) printf("%4d",arr[i]);
return 0;
}