冒泡排序法的十六种写法
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 |
→ |
以上是关于冒泡排序法的十六种写法的主要内容,如果未能解决你的问题,请参考以下文章