冒泡排序及其改进算法

来源:互联网 发布:随身带着淘宝去异界295 编辑:程序博客网 时间:2024/05/21 17:17

将数组a[10] = {7,2,9,4,1,3,8,6,5,0}从小到大排序并打印结果

打印函数:

void printA(int *a,int len){int i;for(i = 0; i < len; i++){printf("%4d",a[i]);}printf("\n");}

交换两个元素的位置:将数组首地址及要交换的元素下标作为参数传入

void Swap(int *a,int i,int j){int tmp = a[i];a[i] = a[j];a[j] = tmp;}
冒泡排序:

冒泡排序外层循环控制轮数,每次从前往后找出一个最大的数沉底

void bubble(int *a,int len){int i,j;for(i = 0; i < len-1; i++){for(j = 0; j < len-1-i; j++){if(a[j] > a[j+1]){Swap(a,j,j+1);}}}}
main调用

int main(){int a[10] = {7,2,9,4,1,3,8,6,5,0};int len = sizeof(a)/sizeof(a[0]);bubble(a,len);printA(a,len);return 0;}

下面为冒泡排序的改进算法:鸡尾酒排序

鸡尾酒排序在冒泡排序基础上加入一个循环,在从前往后找到一个最大数沉底后从后往前找一个最小数浮顶

void cocktail(int *a,int len){int i;int left = 0;int right = len-1;while(left < right)                      //左右边界控制循环次数,当左右边界相遇结束循环{for(i = left; i < right; i++)    //从左往右,找出一个最大数沉底{if(a[i] > a[i+1]){Swap(a,i,i+1);}}right--;                         //右边界左移一个for(i = right; i > left; i--)    //从右往左,找出一个最小数浮顶{if(a[i-1] > a[i]){Swap(a,i-1,i);}}left++;                          //左边界右移一个}}