基本氣泡排序與演算法改進
阿新 • • 發佈:2019-02-20
氣泡排序基本思想,相鄰兩數一次比較,按照要求順序交換。
#include <stdio.h>
void BubbleSort(int *Array,int n);
//*Array,待排陣列;n,陣列大小
int main()
{
int Array[8]={5,9,2,16,7,4,12,15};
int i;
printf("待排序陣列:\n");
for(i=0;i<8;i++)
printf("%d ",*(Array+i));
BubbleSort(Array,8);
printf("\n氣泡排序後的陣列為:\n" );
for(i=0;i<8;i++)
printf("%d ",*(Array+i));
}
//基本冒泡演算法
void BubbleSort(int *Array,int n)
{
int temp,i,j;
for(i=n-1;i>0;i--)
for(j=0;j<i;j++)
if(*(Array+j)>*(Array+j+1))
{
temp= *(Array+j);
*(Array+j) = *(Array +j+1);
*(Array+j+1) = temp;
}
}
/*通過分析我們可以知道在每一趟冒泡比較之後,若發現從某個位置r開始,
不再進行記錄交換,就說明Array[r+1]到Array[n-1]已經排好序,
因此下一趟比較只要進行到位置r就行。若某一趟掃描中沒有記錄交換,
這說明所有元素都已有序,演算法可以結束,而不用進行n-1次掃描。
冒泡演算法改進,用變數m記錄資料最後一次交換位置記錄資料最後一次交換位置*/
void BubbleSort(int *Array,int n)
{
int bound=n;
int m,i;
int temp;
while (bound!=0)
{
m=0;
for(i=0;i<bound;i++)
{
if(*Array+i)>*(Array+i+1)
{
temp= *(Array+j);
*(Array+j) = *(Array+j+1);
*(Array+j+1) = temp;
m=i;
}
}
bound=m;
}
}
/*以上都是單向排序,即大樹均往下沉,經過一次比較可以
把最大數的記錄送到最後的位置。其實我們可以在使大數往下
的同時讓小數往上升,這樣一次掃描就可以將最大的和最小的
記錄放到最終位置上,這就是雙向氣泡排序思想;
演算法改進,雙向排序,大數往下,小數往上*/
void BubbleSort(int *Array,int n)
{
int boundmin=0;
int boundmax=n;
int min,max,i;
int temp;
while(boundmin<boundmax)
{
min=0;
max=0;
for(i=boundmin;i<boundmax;i++) //大數往下沉
{
if(*Array+i)>*(Array+i+1))
{
temp= *(Array+j);
*(Array+j) = *(Array+j+1);
*(Array+j+1) = temp;
max=i; //max記錄下沉時候最後一次發生資料交換的位置
}
}
if(max==0) //本次掃描沒有記錄交換,掃描結束
break;
boundmax=max;
for(i=boundmax-1;i>boundmin;i--) //小數往上升
{
if(*(Array+i)<*(Array+i-1))
{
swap(*(Array+j),*(Array+j),temp);
min=i;
}
}
if(min==0)
break;
boundmin=min;
}
}