冒泡排序法的十六种写法

Posted 阿硃C语言学习c程序

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序法的十六种写法相关的知识,希望对你有一定的参考价值。

冒泡法,从后向前比较、从前向后比较、a[j]和a[j+1]比较、a[j]和a[j-1]比较、ⅰ的初值终值,各种组合下来,可以组合出16种写法。


  • “正向冒泡法”:从后向前比较,小的数冒到前面

程序一】

/*冒泡法排序思想:以升序排序为例:从后向前比较,总是相邻两元素两两比较,小的数“冒”到前面。*/

/*冒泡法升序排序*/

//从后向前比较,小的数冒到前面

#include <stdio.h>

#include "stdlib.h"

#include "time.h"

#define N 10

int main()

{int i,j,k,a[N];

srand((unsigned)time(NULL));

printf("排序前\n");

for(i=0;i<N;i++)

    printf("%-6d",a[i]=rand()%11);

for(i=N-1;i>0;i--)/*i初值为最大下标,实际终值为第2小下标*//*外循环N-1轮*/

    for(j=N-1;j>N-1-i;j--)/*从后向前,小的数冒到前面。(i取最后一个值时,要保证内循环是一次)*/

        if(a[j]<a[j-1])

          {k=a[j];a[j]=a[j-1];a[j-1]=k;}

printf("\n排序后:\n");

for(i=0;i<=N-1;i++)

    printf("%-6d",a[i]);

return 0;

}

下标0


……



下标N-1


实际终值i=1

……


初值i=N-1



……

j-1

初值j

 

程序二】

/*冒泡法排序思想:以升序排序为例:从后向前比较,总是相邻两元素两两比较,小的数“冒”到前面。*/

/*冒泡法升序排序*/

//从后向前比较,小的数冒到前面

#include <stdio.h>

#include "stdlib.h"

#include "time.h"

#define N 10

int main()

{int i,j,k,a[N];

srand((unsigned)time(NULL));

printf("排序前\n");

for(i=0;i<N;i++)

    printf("%-6d",a[i]=rand()%11);

for(i=N-1;i>0;i--)/*i初值为最大下标,实际终值为第2小下标*//*外循环N-1轮*/

    for(j=N-2;j>=N-1-i;j--)/*从后向前,小的数冒到前面。(i取最后一个值时,要保证内循环是一次)*/

        if(a[j]>a[j+1])

            {k=a[j];a[j]=a[j+1];a[j+1]=k;}

printf("\n排序后:\n");

for(i=0;i<=N-1;i++)

    printf("%-6d",a[i]);

return 0;

}

下标0


……



下标N-1


实际终值i=1

……


初值i=N-1



……

j

j+1

  

程序三】

/*“正向冒泡法”排序思想:以升序排序为例:从后向前比较,总是相邻两元素两两比较,小的数"冒"到前面。*/

/*冒泡法升序排序*/

//从后向前比较,小的数冒到前面

#include <stdio.h>

#include "stdlib.h"

#include "time.h"

#define N 10

int main()

{int i,j,k,a[N];

srand((unsigned)time(NULL));

printf("排序前\n");

for(i=0;i<N;i++)

    printf("%-6d",a[i]=rand()%11);

for(i=N-2;i>=0;i--)/*i初值是第2大下标,终值是最小下标*//*外循环N-1轮*/

    for(j=N-1;j>=N-1-i;j--)/*从后向前,小的数冒到前面。(i取最后一个值时,要保证内循环是一次)*/

        if(a[j]<a[j-1])

            {k=a[j];a[j]=a[j-1];a[j-1]=k;}

printf("\n排序后:\n");

for(i=0;i<=N-1;i++)

    printf("%-6d",a[i]);

return 0;

}

下标0


……



下标N-1

实际终值i=0


……

初值i=N-2




……

j-1

j

 

程序四】

/*冒泡法排序思想:以升序排序为例:从后向前比较,总是相邻两元素两两比较,小的数"冒"到前面。*/

/*冒泡法升序排序*/

//从后向前比较,小的数冒到前面

#include <stdio.h>

#include "stdlib.h"

#include "time.h"

#define N 10

int main()

{int i,j,k,a[N];

srand((unsigned)time(NULL));

printf("排序前\n");

for(i=0;i<N;i++)

    printf("%-6d",a[i]=rand()%11);

for(i=N-2;i>=0;i--)/*i初值是第2大下标,终值是最小下标*//*外循环N-1轮*/

    for(j=N-2;j>N-3-i;j--)/*从后向前,小的数冒到前面。(i取最后一个值时,要保证内循环是一次)*/

        if(a[j]>a[j+1])

            {k=a[j];a[j]=a[j+1];a[j+1]=k;}

printf("\n排序后:\n");

for(i=0;i<=N-1;i++)

    printf("%-6d",a[i]);

return 0;

}

下标0


……



下标N-1

实际终值i=0


……

初值i=N-2




……

j

j+1

 

程序五】

/*冒泡法排序思想:以升序排序为例:从后向前比较,总是相邻两元素两两比较,小的数"冒"到前面。*/

/*冒泡法升序排序*/

//从后向前比较,小的数冒到前面

#include <stdio.h>

#include "stdlib.h"

#include "time.h"

#define N 10

int main()

{int i,j,k,a[N];

srand((unsigned)time(NULL));

printf("排序前\n");

for(i=0;i<N;i++)

    printf("%-6d",a[i]=rand()%11);

for(i=0;i<=N-2;i++)/*外循环共N-1轮*/

    for(j=N-1;j>i;j--)/*每轮外循环当中 内循环N-1-i次(i取最后一个值时,要保证内循环是一次,即a[N-1]和a[N-2]比)*/

        if(a[j]<a[j-1])//总是相邻两数比较

            {k=a[j];a[j]=a[j-1];a[j-1]=k;}

printf("\n排序后:\n");

for(i=0;i<=N-1;i++)

    printf("%-6d",a[i]);

return 0;

}

下标0


……



下标N-1

初值i=0

……


实际终值i=N-2




……

j-1

j

  

程序六】

/*冒泡法排序思想:以升序排序为例:从后向前比较,总是相邻两元素两两比较,小的数"冒"到前面。*/

/*冒泡法升序排序*/

//从后向前比较,小的数冒到前面

#include <stdio.h>

#include "stdlib.h"

#include "time.h"

#define N 10

int main()

{int i,j,k,a[N];

srand((unsigned)time(NULL));

printf("排序前\n");

for(i=0;i<N;i++)

    printf("%-6d",a[i]=rand()%11);

for(i=0;i<=N-2;i++)/*外循环共N-1轮*/

    for(j=N-2;j>=i;j--)/*每轮外循环当中 内循环N-1-i次(i取最后一个值时,要保证内循环是一次,即a[N-2]和a[N-2+1]比)*/

        if(a[j]>a[j+1])//总是相邻两数比较

            {k=a[j];a[j]=a[j+1];a[j+1]=k;}

printf("\n排序后:\n");

for(i=0;i<=N-1;i++)

    printf("%-6d",a[i]);

return 0;

}

下标0


……



下标N-1

初值i=0

……


实际终值i=N-2




……

j

j+1

 

程序七】

/*冒泡法排序思想:以升序排序为例:从后向前比较,总是相邻两元素两两比较,小的数"冒"到前面。*/

/*冒泡法升序排序*/

//从后向前比较,小的数冒到前面

#include <stdio.h>

#include "stdlib.h"

#include "time.h"

#define N 10

int main()

{int i,j,k,a[N];

srand((unsigned)time(NULL));

printf("排序前\n");

for(i=0;i<N;i++)

    printf("%-6d",a[i]=rand()%11);

for(i=1;i<=N-1;i++)/*外循环共N-1轮*/

    for(j=N-1;j>=i;j--)/*每轮外循环当中 内循环N-1-i次(i取最后一个值时,要保证内循环是一次,即a[N-1]和a[N-1-1]比)*/

        if(a[j]<a[j-1])//总是相邻两数比较

            {k=a[j];a[j]=a[j-1];a[j-1]=k;}

printf("\n排序后:\n");

for(i=0;i<=N-1;i++)

    printf("%-6d",a[i]);

return 0;

}

下标0


……



下标N-1


初值i=1



实际终值i=N-1



……

j-1

j

 

程序八】

/*冒泡法排序思想:以升序排序为例:从后向前比较,总是相邻两元素两两比较,小的数"冒"到前面。*/

/*冒泡法升序排序*/

//从后向前比较,小的数冒到前面

#include <stdio.h>

#include "stdlib.h"

#include "time.h"

#define N 10

int main()

{int i,j,k,a[N];

srand((unsigned)time(NULL));

printf("排序前\n");

for(i=0;i<N;i++)

    printf("%-6d",a[i]=rand()%11);

for(i=1;i<=N-1;i++)/*外循环共N-1轮*/

    for(j=N-2;j>=i-1;j--)/*每轮外循环当中 内循环N-1-i次(i取最后一个值时,要保证内循环是一次,即a[N-2]和a[N-2+1]比)*/

        if(a[j]>a[j+1])//总是相邻两数比较

            {k=a[j];a[j]=a[j+1];a[j+1]=k;}

printf("\n排序后:\n");

for(i=0;i<=N-1;i++)

    printf("%-6d",a[i]);

return 0;

}

下标0


……



下标N-1


初值i=1



实际终值i=N-1



……

j

j+1

 

  • “反向冒泡法”:从前向后比较,大的数沉到底下(后面)

程序一:

/*“反向”冒泡法排序思想:以升序排序为例:从前向后比较,总是相邻两元素两两比较,大的数"沉"到"底下"。*/

/*冒泡法升序排序*/

//从前向后比较,大的数沉到后面

include <stdio.h>

#include "stdlib.h"

#include "time.h"

#define N 10

int main()

{int i,j,k,a[N];

srand((unsigned)time(NULL));

printf("排序前\n");

for(i=0;i<N;i++)

    printf("%-6d",a[i]=rand()%11);

for(i=0;i<=N-2;i++)/*i初值为最小下标,终值为第2大下标*//*外循环N-1轮*/

    for(j=0;j<N-1-i;j++)/*从前向后比较,大的数沉到底下(后面)。(i取最后一个值时,要保证内循环是一次)*/

        if(a[j]>a[j+1])

            {k=a[j];a[j]=a[j+1];a[j+1]=k;}

printf("\n排序后:\n");

for(i=0;i<=N-1;i++)

    printf("%-6d",a[i]);

return 0;

}

下标0



……


下标N-1

初值i=0


……

实际终值i=N-2


j

j+1

……



 

程序二:

/*"反向"冒泡法排序思想:以升序排序为例:从前向后比较,总是相邻两元素两两比较,大的数"沉"到"底下"。*/

/*冒泡法升序排序*/

//从前向后比较,大的数沉到后面

#include <stdio.h>

#include "stdlib.h"

#include "time.h"

#define N 10

int main()

{int i,j,k,a[N];

srand((unsigned)time(NULL));

printf("排序前\n");

for(i=0;i<N;i++)

    printf("%-6d",a[i]=rand()%11);

for(i=0;i<=N-2;i++)/*i初值为最小下标,终值为第2大下标*//*外循环N-1轮*/

    for(j=1;j<=N-1-i;j++)/*从前向后比较,大的数沉到底下(后面)。(i取最后一个值时,要保证内循环是一次)*/

        if(a[j-1]>a[j])

            {k=a[j-1];a[j-1]=a[j];a[j]=k;}

printf("\n排序后:\n");

for(i=0;i<=N-1;i++)

    printf("%-6d",a[i]);

return 0;

}

下标0



……


下标N-1

初值i=0


……

实际终值i=N-2


j-1

j

……



 

程序三:

/*"反向"冒泡法排序思想:以升序排序为例:从前向后比较,总是相邻两元素两两比较,大的数"沉"到"底下"。*/

/*冒泡法升序排序*/

//从前向后比较,大的数沉到后面

#include <stdio.h>

#include "stdlib.h"

#include "time.h"

#define N 10

int main()

{int i,j,k,a[N];

srand((unsigned)time(NULL));

printf("排序前\n");

for(i=0;i<N;i++)

    printf("%-6d",a[i]=rand()%11);

for(i=1;i<=N-1;i++)/*i初值为第2小下标,终值为最大下标*//*外循环N-1轮*/

    for(j=0;j<=N-1-i;j++)/*从前向后比较,大的数沉到底下(后面)。(i取最后一个值时,要保证内循环是一次)*/

        if(a[j]>a[j+1])

            {k=a[j];a[j]=a[j+1];a[j+1]=k;}

printf("\n排序后:\n");

for(i=0;i<=N-1;i++)

    printf("%-6d",a[i]);

return 0;

}

下标0



……


下标N-1


初值i=1

……


实际终值i=N-1

j

j+1

……



 

程序四:

/*"反向"冒泡法排序思想:以升序排序为例:从前向后比较,总是相邻两元素两两比较,大的数"沉"到"底下"。*/

/*冒泡法升序排序*/

//从前向后比较,大的数沉到后面

#include <stdio.h>

#include "stdlib.h"

#include "time.h"

#define N 10

int main()

{int i,j,k,a[N];

srand((unsigned)time(NULL));

printf("排序前\n");

for(i=0;i<N;i++)

    printf("%-6d",a[i]=rand()%11);

for(i=1;i<=N-1;i++)/*i初值为第2小下标,终值为最大下标*//*外循环N-1轮*/

    for(j=1;j<=N-i;j++)/*从前向后比较,大的数沉到底下(后面)。(i取最后一个值时,要保证内循环是一次)*/

        if(a[j]<a[j-1])

            {k=a[j];a[j]=a[j-1];a[j-1]=k;}

printf("\n排序后:\n");

for(i=0;i<=N-1;i++)

    printf("%-6d",a[i]);

return 0;

}

下标0



……


下标N-1


初值i=1

……


实际终值i=N-1

j-1

j

……



 

 程序五:

/*"反向"冒泡法排序思想:以升序排序为例:从前向后比较,总是相邻两元素两两比较,大的数"沉"到"底下"。*/

/*冒泡法升序排序*/

//从前向后比较,大的数沉到后面

#include <stdio.h>

#include "stdlib.h"

#include "time.h"

#define N 10

int main()

{int i,j,k,a[N];

srand((unsigned)time(NULL));

printf("排序前\n");

for(i=0;i<N;i++)

    printf("%-6d",a[i]=rand()%11);

for(i=N-1;i>0;i--)/*外循环共N-1轮*/

    for(j=0;j<i;j++)/*每轮外循环当中 内循环i次(i取最后一个值时,要保证内循环是一次,即a[0]和a[1]比)*/

        if(a[j]>a[j+1])//总是相邻两数比较

            {k=a[j];a[j]=a[j+1];a[j+1]=k;}

printf("\n排序后:\n");

for(i=0;i<=N-1;i++)

    printf("%-6d",a[i]);

return 0;

}

下标0


……



下标N-1


实际终值i=1



初值i=N-1

j

j+1




 

程序六:

/*"反向"冒泡法排序思想:以升序排序为例:从前向后比较,总是相邻两元素两两比较,大的数"沉"到"底下"。*/

/*冒泡法升序排序*/

//从前向后比较,大的数沉到后面

#include <stdio.h>

#include "stdlib.h"

#include "time.h"

#define N 10

int main()

{int i,j,k,a[N];

srand((unsigned)time(NULL));

printf("排序前\n");

for(i=0;i<N;i++)

    printf("%-6d",a[i]=rand()%11);

for(i=N-1;i>0;i--)/*外循环共N-1轮*/

    for(j=1;j<=i;j++)/*每轮外循环当中 内循环i次(i取最后一个值时,要保证内循环是一次,即a[0]和a[1]比)*/

        if(a[j]<a[j-1])//总是相邻两数比较

            {k=a[j];a[j]=a[j-1];a[j-1]=k;}

printf("\n排序后:\n");

for(i=0;i<=N-1;i++)

    printf("%-6d",a[i]);

return 0;

}

下标0



……


下标N-1


实际终值i=1


……

初值i=N-1

j-1

j

……



 

程序七:

/*"反向"冒泡法排序思想:以升序排序为例:从前向后比较,总是相邻两元素两两比较,大的数"沉"到"底下"。*/

/*冒泡法升序排序*/

//从前向后比较,大的数沉到后面

#include <stdio.h>

#include "stdlib.h"

#include "time.h"

#define N 10

int main()

{int i,j,k,a[N];

srand((unsigned)time(NULL));

printf("排序前\n");

for(i=0;i<N;i++)

    printf("%-6d",a[i]=rand()%11);

for(i=N-2;i>=0;i--)/*外循环共N-1轮*/

    for(j=0;j<=i;j++)/*(i取最后一个值时,要保证内循环是一次*/

        if(a[j]>a[j+1])//总是相邻两数比较

            {k=a[j];a[j]=a[j+1];a[j+1]=k;}

printf("\n排序后:\n");

for(i=0;i<=N-1;i++)

    printf("%-6d",a[i]);

return 0;

}

下标0


……



下标N-1

实际终值i=0


……

初值i=N-2


j

j+1





程序八:

/*"反向"冒泡法排序思想:以升序排序为例:从前向后比较,总是相邻两元素两两比较,大的数"沉"到"底下"。*/

/*冒泡法升序排序*/

//从前向后比较,大的数沉到后面

#include <stdio.h>

#include "stdlib.h"

#include "time.h"

#define N 10

int main()

{int i,j,k,a[N];

srand((unsigned)time(NULL));

printf("排序前\n");

for(i=0;i<N;i++)

    printf("%-6d",a[i]=rand()%11);

for(i=N-2;i>=0;i--)/*外循环共N-1轮*/

    for(j=1;j<=i+1;j++)/*(i取最后一个值时,要保证内循环是一次)*/

        if(a[j-1]>a[j])//总是相邻两数比较

            {k=a[j];a[j]=a[j-1];a[j-1]=k;}

printf("\n排序后:\n");

for(i=0;i<=N-1;i++)

    printf("%-6d",a[i]);

return 0;

}

下标0


……



下标N-1

实际终值i=0


……

初值i=N-2


j-1

j





以上是关于冒泡排序法的十六种写法的主要内容,如果未能解决你的问题,请参考以下文章

冒泡排序法对随机生成的十个数按升序进行排序

冒泡排序法的优化

八大数据排序法冒泡排序法的图形理解和案例实现 | C++

VBA: 冒泡排序法的代码实现

976. 三角形的最大周长(冒泡排序法的活用)

冒泡法的实例(给数组排序)