将数组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++; //左边界右移一个
}
}