- #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;
- }
C语言的冒泡排序法改进
最新推荐文章于 2023-01-07 21:59:09 发布