冒泡排序基本思想,相邻两数一次比较,按照要求顺序交换。
#include <stdio.h>
void BubbleSort(int *Array,int n);
//*Array,待排数组;n,数组大小
int main()
{
int Array[8]={5,9,2,16,7,4,12,15};
int i;
printf("待排序数组:\n");
for(i=0;i<8;i++)
printf("%d ",*(Array+i));
BubbleSort(Array,8);
printf("\n冒泡排序后的数组为:\n");
for(i=0;i<8;i++)
printf("%d ",*(Array+i));
}
//基本冒泡算法
void BubbleSort(int *Array,int n)
{
int temp,i,j;
for(i=n-1;i>0;i--)
for(j=0;j<i;j++)
if(*(Array+j)>*(Array+j+1))
{
temp= *(Array+j);
*(Array+j) = *(Array+j+1);
*(Array+j+1) = temp;
}
}
/*通过分析我们可以知道在每一趟冒泡比较之后,若发现从某个位置r开始,
不再进行记录交换,就说明Array[r+1]到Array[n-1]已经排好序,
因此下一趟比较只要进行到位置r就行。若某一趟扫描中没有记录交换,
这说明所有元素都已有序,算法可以结束,而不用进行n-1次扫描。
冒泡算法改进,用变量m记录数据最后一次交换位置记录数据最后一次交换位置*/
void BubbleSort(int *Array,int n)
{
int bound=n;
int m,i;
int temp;
while(bound!=0)
{
m=0;
for(i=0;i<bound;i++)
{
if(*Array+i)>*(Array+i+1)
{
temp= *(Array+j);
*(Array+j) = *(Array+j+1);
*(Array+j+1) = temp;
m=i;
}
}
bound=m;
}
}
/*以上都是单向排序,即大树均往下沉,经过一次比较可以
把最大数的记录送到最后的位置。其实我们可以在使大数往下
的同时让小数往上升,这样一次扫描就可以将最大的和最小的
记录放到最终位置上,这就是双向冒泡排序思想;
算法改进,双向排序,大数往下,小数往上*/
void BubbleSort(int *Array,int n)
{
int boundmin=0;
int boundmax=n;
int min,max,i;
int temp;
while(boundmin<boundmax)
{
min=0;
max=0;
for(i=boundmin;i<boundmax;i++) //大数往下沉
{
if(*Array+i)>*(Array+i+1))
{
temp= *(Array+j);
*(Array+j) = *(Array+j+1);
*(Array+j+1) = temp;
max=i; //max记录下沉时候最后一次发生数据交换的位置
}
}
if(max==0) //本次扫描没有记录交换,扫描结束
break;
boundmax=max;
for(i=boundmax-1;i>boundmin;i--) //小数往上升
{
if(*(Array+i)<*(Array+i-1))
{
swap(*(Array+j),*(Array+j),temp);
min=i;
}
}
if(min==0)
break;
boundmin=min;
}
}