c语言 算法 o(n),【算法】改进的冒泡排序 O(n^2) 稳定的 C语言

改进的冒泡排序

一、算法描述

基于原冒泡排序

每次选取第一个元素作为主元往后进行比较,若遇到比它小的则放到它左边(即进行交换),若遇到比它大的则选取大的作为主元进行后续比较,每趟选取了无序列中最大元素放置无序列最后位,当一趟比较没有发生交换则为有序序列,即像吐泡泡一样第一次把最大的数吐到最末位,第二趟把倒数第二大的数吐到倒数第二位。。。。。

可记录每趟最后一次发生交换的两记录的位置,假设记其下标为last,也即在该位置之后(到序列末尾)都是有序数列,则规定下趟排序的范围则为0到last,同样当某趟排序不发生交换时完成排序

二、算法分析

原每趟排序的范围固定为0到n,0到n-1,0到n-2......改进后则每次都为0到last,且每次的last是远可能小于且一定会小于n-i的,当last为0是则完成排序,这样则大大加快算法的执行时间

三、算法实现代码

void Gaijindemaopaopaixu(List*lst)

{

int i, j;

int temp;//用于交换

int last ;//用于记录最后发生交换的位置

i = lst->Size - 1;

while (i > 0) //当i=0时结束

{

last = 0;//也即若不发生交换,i赋值0,结束排序

for (j = 0; j < i; j++)//完成0到i期间的比较,i逐渐变小

{

if (lst->Elements[j + 1] < lst->Elements[j])//若主元大于需比较的也即其后面的元素,进行交换,也即

{ //放到他左边若小于或等于,不做任何处理,也即换取了后一个数作为主元

temp = lst->Elements[j + 1];

lst->Elements[j + 1] = lst->Elements[j];

lst->Elements[j] = temp;

last=j;//记录最后发生交换的位置

}

}

i=last;//缩短范围

}

}

四、实例测试代码

#include

#include

#include

#define MaxSize 99

typedef struct list {

int Size;//大小

int Elements[MaxSize];//用数组存放

}List;//定义顺序表

void Gaijindemaopaopaixu(List*lst);//改进冒泡排序函数声明

int main(void) {

List a;//定义一个顺序表对象a

int i;

srand((unsigned)time(NULL)); //随机数种子

a.Size = 10;//定义大小为10

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

{

a.Elements[i] = rand() % 10;//初始化顺序表

}

printf(" 初始原表为:");

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

{

printf("%d ", a.Elements[i]);

}

printf("

");

Gaijindemaopaopaixu(&a);//调用改进冒泡函数,修改值需传入地址

printf("经改进冒泡排序:");

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

{

printf("%d ", a.Elements[i]);

}

getchar();

return 0;

}

void Gaijindemaopaopaixu(List*lst)

{

int i, j;

int temp;//用于交换

int last ;//用于记录最后发生交换的位置

i = lst->Size - 1;

while (i > 0) //当i=0时结束

{

last = 0;

for (j = 0; j < i; j++)//完成0到i期间的比较,i逐渐变小

{

if (lst->Elements[j + 1] < lst->Elements[j])//若主元大于需比较的也即其后面的元素,进行交换,也即

{ //放到他左边若小于或等于,不做任何处理,也即换取了后一个数作为主元

temp = lst->Elements[j + 1];

lst->Elements[j + 1] = lst->Elements[j];

lst->Elements[j] = temp;

last=j;//记录最后发生交换的位置

}

}

i=last;//缩短范围

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值