#include <stdio.h>
#include <stdlib.h>
//冒泡排序
void BubbleSort(int *array,int n)
{
int temp;
for (int i=n-1;i>0;i--)
{
for (int j=0;j<i;j++)
{
if (*(array+j)>*(array+j+1))
{
temp=*(array+j);
*(array+j)=*(array+j+1);
*(array+j+1)=temp;
}
}
}
}
//改进的冒泡排序,在一次冒泡的过程中,如果没有发生交换,则已经有序
void ImprovedBubbleSort(int *array,int n)
{
int flag,temp;
for (int i=n-1;i>0;i--)
{
flag=0;//每次冒泡前将flag置0
for (int j=0;j<i;j++)
{
if (*(array+j)>*(array+j+1))
{
temp=*(array+j);
*(array+j)=*(array+j+1);
*(array+j+1)=temp;
flag=1;//只要发生了一次交换,flag置1
}
}
//在一次冒泡过程后,flag依然为0,表示未发生交换,则排序结束
if (0==flag)
{
break;
}
}
}
//进一步改进的冒泡排序,如果在某次冒泡过程中,最后一次进行交换的位置为flag,则
//表示flag之后的序列已经有序,那么下一次冒泡就无需比较flag之后的序列,即只要比
//较到flag就可以结束此次冒泡过程。当flag=0时,表示某趟冒泡没有发生交换,即可结束。
void BetterBubbleSort(int *array,int n)
{
int temp,flag,bound=n-1;//bound记录每趟冒泡的边界
while (bound!=0)
{
flag=0;//flag初始置为0,一趟冒泡后如果flag仍然为0,则已经有序,排序结束
for (int j=0;j<bound;j++)
{
if (*(array+j)>*(array+j+1))
{
temp=*(array+j);
*(array+j)=*(array+j+1);
*(array+j+1)=temp;
flag=j;//flag用于记录一次冒泡过程中最后一次交换的位置
}
}
bound=flag;
}
}
//双向冒泡排序,一次冒泡的过程中,分别将最大的记录和最小的记录都放到最终的位置
void DoubleBubbleSort(int *array,int n)
{
int temp,j;
int maxFlag,minFlag;//分别作为双向冒泡的标志
int maxBound=n-1,minBound=0;//分别记录最大和最小的边界
while (maxBound>minBound)
{
//初始将标志位置为0,某次交换过程后标志位依然为0,则排序结束
maxFlag=0;
minFlag=0;
//此次交换将最大值下沉
for (j=minBound;j<maxBound;j++)
{
if (*(array+j)>*(array+j+1))
{
temp=*(array+j);
*(array+j)=*(array+j+1);
*(array+j+1)=temp;
maxFlag=j;//记录下沉过程中最后一次交换的位置
}
}
//下沉的过程没有发生交换,排序结束
if (0==maxFlag)
{
break;
}
//下沉过程结束后,重新设置下边界(最大有序边界)
maxBound=maxFlag;
//此次交换将最小值上浮
for (j=maxBound;j>minBound;j--)
{
if (*(array+j)<*(array+j-1))
{
temp=*(array+j);
*(array+j)=*(array+j-1);
*(array+j-1)=temp;
minFlag=j;//记录上浮过程中最后一次交换的位置
}
}
//上浮的过程没有发生交换,排序结束
if (0==minFlag)
{
break;
}
//上浮过程结束后,重新设置上边界(最小有序边界)
minBound=minFlag;
}
}
int main(int argc, char* argv[])
{
int array[8]={5,9,2,16,7,4,12,15};
int i;
printf("Before Sort: ");
for (i=0;i<8;i++)
{
printf("%2d ",array[i]);
}
//BubbleSort(array,8);
//ImprovedBubbleSort(array,8);
//BetterBubbleSort(array,8);
DoubleBubbleSort(array,8);
printf("\n After Sort: ");
for (i=0;i<8;i++)
{
printf("%2d ",array[i]);
}
printf("\n");
return 0;
}