冒泡排序
标签:yun amt acp p2p lin crt 排序 cve aac
冒泡排序
冒泡排序(Bubble Sort):
一种最简单的交换排序方法,它通过两两比较相邻记录的关键字,如果发生逆序,则进行交换,从而使关键字小的记录如气泡一般逐渐往上‘漂移’(左移),或者使关键字大的记录如石块一样逐渐向下‘坠落’(右移).
算法思想:
实例分析:
第一趟排序: 最右边我们得到了最大的泡 8
第二趟排序: 倒数第二个元素是除了8之外最大的元素 7
第三趟排序:倒数第三个与元素是除了8 7之外的最大的元素 6
一次类推我们只需要进行到第七趟排序 数列的第一个元素必定是最小的泡了因为最大的都已经往前冒了
得到的第一个元素肯定是最小的
分析一下代码:
#include
#include #define L 8
//输出数列
void pri_sort(char *a, int l)
{
int i;
for (i = 0; i )
{
if (i == l - 1)
printf("%d\n", a[i]);
else
printf("%d ", a[i]);
}
}
int main()
{
char sortN[L] = { 4,6,1,5,7,3,2,8 };
char temp;
int i, j;
/*从小到大的冒泡排序*/
/*长度为L的数列只需要L-1趟排序因为最后一趟只有一个元素而且它是最小的在它后面的都比它大
*/
for (i = 1; i )
{
printf("第%d趟排序:\n", i);
//j=0 每趟从数列的头部开始比较 L-i是去掉尾部已经泡出来的泡 因为它们已经是有序的了
for (j = 0; j )
{
if (sortN[j]>sortN[j+1])
{
temp = sortN[j];
sortN[j] = sortN[j + 1];
sortN[j + 1] = temp;
}
pri_sort(sortN, L);
}
}
system("pause");
}
每一趟排序的过程如下:
代码优化:
从上面的代码我们发现第5趟的排序 数列已经排序完成
剩下的第6,7趟其实是不必要的排序 所以我们设置一个flag变量 如果本次排序没有进行下一次就没有必要进行了
#include
#include #define L 8
void pri_sort(char *a, int l)
{
int i;
for (i = 0; i )
{
if (i == l - 1)
printf("%d\n", a[i]);
else
printf("%d ", a[i]);
}
}
int main()
{
char sortN[L] = { 4,6,1,5,7,3,2,8 };
char temp;
int i, j;
/*从小到大的冒泡排序*/
/*长度为L的数列只需要L-1趟排序因为最后一趟只有一个元素而且它是最小的在它后面的都比它大*/
for (i = 1; i )
{
int flag = 0;//标志
printf("第%d趟排序:\n", i);
for (j = 0; j )
{
if (sortN[j]>sortN[j+1])
{
temp = sortN[j];
sortN[j] = sortN[j + 1];
sortN[j + 1] = temp;
flag = 1;
}
pri_sort(sortN, L);
}
//本趟没有排序操作 已经排序完成 退出
if (!flag)
break;
}
system("pause");
}
从大到小的冒泡排序 原理是一样的:
if (sortN[j]1])//小的往后冒就OK了
刚才的例子是从左往右冒泡
我们可以从右往左冒:
#include
#include #define L 8
void pri_sort(char *a, int l)
{
int i;
for (i =
文章来自:
搜素材网的
编程语言模块,转载请注明文章出处。
文章标题:
冒泡排序
文章链接:http://soscw.com/essay/25753.html
评论