五種排序算法 若有數組a[N]
void exchange(int *l,int *r)
{
int temp=*l;
*l=*r;
*r=temp;
}
①冒泡排序 雙層循環,兩兩比較
for(i=0;i<N-1;i++)
for(j=0;j<N-1;j++)
if(a[j]>a[j+1])
exchange(&a[j],&a[j+1]);
②選擇排序 雙層循環,從左至右依次找最小值
for(i=0;i<N;i++)
{
min=i;
for(j=i+1;j<N;j++)
if(a[min]>a[j])
min=j;
exchange(&a[min],&a[i]);
}
③插入排序 在已排好序的數列中,一個一個的插入新元素
int temp;
for(i=0;i<N;i++)
{
temp=a[i+1];
for(j=i;temp<a[j]&&j>=0;j--)
a[j+1]=a[j];
a[j+1]=temp;
}
④歸並排序 用遞歸將無序序列,不斷拆分至單個元素(此時各序列均為有序),再將拆分后的各個有序序列歸併
void merge(int l,int m,int r)
{
int i,j,k;
for(i=l;i<=r;i++)
b[i]=a[i];
k=i=l;
j=m+1;
while(i<=m&&j<=r)
if(b[i]<b[j])
//b[i]中存儲著a[i]的前半部份元素,而後半部份在b[j]中
a[k++]=b[i++];
else
a[k++]=b[j++];
while(i<=m)
a[k++]=b[i++];
while(j<=r)
a[k++]=b[j++];
}
void merge_sort(int l,int r)
{
if(l>=r)
return;
int m=(l+r)/2;
merge_sort(0,m);
merge_sort(m+1,r);
merge(l,m,r);
}
⑤快速排序 每次遞歸都以某個點為界,將一串無序序列分為左右兩邊,左邊都比該點小,右邊都比該點大,直至將其分為單個元素
int position(int l,int r)
{
int i,j;
for(i=l+1,j=l;i<=r;i++)
if(a[i]<a[l])
exchange(&a[i],&a[++j]);
exchange(&a[j],&a[l]);
return j;
}
void quick_sort(int l,int r)
{
if(l>=r)
return;
int p=position(l,r);
quick_sort(0,p-1);
quick_sort(p+1,r);
}