【算法】改进的冒泡排序 O(n^2) 稳定的 C语言
2015-11-27 14:39
232 查看
改进的冒泡排序
一、算法描述
基于原冒泡排序
每次选取第一个元素作为主元往后进行比较,若遇到比它小的则放到它左边(即进行交换),若遇到比它大的则选取大的作为主元进行后续比较,每趟选取了无序列中最大元素放置无序列最后位,当一趟比较没有发生交换则为有序序列,即像吐泡泡一样第一次把最大的数吐到最末位,第二趟把倒数第二大的数吐到倒数第二位。。。。。
可记录每趟最后一次发生交换的两记录的位置,假设记其下标为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 <stdio.h> #include <stdlib.h> #include <time.h> #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("\n"); 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;//缩短范围 } }
相关文章推荐
- 冒泡排序及其改进算法C语言实现
- 算法 c语言 冒泡排序改进
- 【Lehr】【数据结构与算法】【C语言】改进版的冒泡排序
- C++ 数据结构与算法:冒泡排序及改进算法
- c语言中冒泡排序、插入排序、选择排序算法比较
- 算法之冒泡排序【C语言】
- 排序算法-对冒泡排序的优化改进算法
- 数据结构&算法实践—【排序|交换排序】冒泡排序及改进
- 【数据结构与算法】内部排序之二:冒泡排序和选择排序(改进优化,附完整源码)
- 算法学习之排序——冒泡排序及其改进算法(Java)
- 冒泡排序的改进算法
- 基本的排序算法之—— 冒泡排序(稳定)(对于固定的内存空间数组或顺序表,对于单链表也可以)
- 数据结构&算法实践—【排序|交换排序】冒泡排序及改进
- 冒泡排序的改进算法和快速排序
- 矩阵相乘改进算法(提高存储器访问效率) C语言实现
- 冒泡排序改进算法(双向起泡)
- 冒泡排序及其改进算法
- 基础算法之排序(1)--冒泡排序 改进
- 冒泡排序的算法分析与改进
- 冒泡排序的算法分析与改进 (选择自 Uncommon 的 Blog )