氣泡排序及其改進演算法
阿新 • • 發佈:2019-02-11
將陣列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++; //左邊界右移一個
}
}