纯手撸——冒泡排序
思想:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。
#include <stdio.h>
int main()
{
int a[] = {9,6,5,7,8,2,1,3}; //自行修改
int n=8; //n为数组中元素个数,即长度
int i;
int j;
int tmp; //交换数据时临时存储用
for (i=0; i<n-1; ++i) //比较n-1轮
{
for (j=n-1; j>i; j--)
{
if (a[j] < a[j-1]) //反序
{
//swap算法
tmp = a[j-1];
a[j-1] = a[j];
a[j] = tmp;
}
}
}
//输出
for (i=0; i<n; i++)
{
printf("%d\x20", a[i]);
}
printf("\n");
}
比较简单,复盘一下:
void BubbleSort(int a[],int n)
{
int i,j,tmp;
for(i=0;i<n-1;i++)
{
for(j=n-1;j>i;j--)
{
if(a[j-1]>[j]) //反序
{
//swap
tmp = a[j-1];
a[j-1]=a[j];
a[j]=tmp;
}
}
}
}
当然,有些情况,在i(i<n-1)趟已经排好了,但仍执行后面几趟比较,没必要,这里进行改进。因为该算法一旦某一趟比较时不出现任何元素交换,则一定排序好了,结束即可。
void BubbleSort(int a[],int n)
{
int i,j;
bool exchange; //标志
for(i=0;i<n-1;i++)
{
exchange=false; //先置为假
for(j=n-1;j>i;j--)
{
if(a[j]<a[j-1])
{
swap(a[j],a[j-1]); //略
exchange=true; //一旦交换,置true
}
}
if(!exchange) //本趟没有交换,中途结束算法
{
return;
}
}
}