1、堆排序
基本思想:将待排序数组看成一颗完全二叉树,利用父节点与子节点之间的关系在无序区中选择最大或最小的关键字进行排序
代码:
void sift(int a[],int low,int high)
{
int tmp,i,j;
i=low;
j=2*i
tmp=a[i];
while(j<=high)
{
if(j<high&&a[j]<a[j+1])
j++;
if(tmp<a[j])
{a[i]=a[j];
i=j;
j=2*i;
}
else break;
}
a[i]=tmp;
}
实现算法为:
void heapsort(int a[],int n)
{
int i;
for(i=n/2;i>=1;i--)
sift(a[],i,n)//建立初始堆
for(int i=n;i>=2;i--)
{
swap(a[1],a[i])
sift(a,1,i-1);
}
}
2、快速排序
基本思想:从无序区中任选一个元素(一般取第一个),将其放在合适的位置,此时数据序列被该元素分成两部分,所有关键字比他小的放在其左边,比他大的放在其右边,把该元素放在这两部分的中间,即为一趟排序,在对产生的两部分重复此过程,直到每部分元素为空,或只有一个元素结束。
代码:
int partition(int a[],int s,int t)
{
int i=s,j=t;
tmp=a[i];
while(i<j)
{
while(j>i&&a[j]>=tmp)
j--;
a[i]=a[j];
while(i<j&&a[i]<=tmp)
i++;
a[j]=a[i];
}
a[i]=tmp;
return i;
}
实现过程:
void quicksort(int a[],int s,int t)
{
int i;
if(s<t)
{
i=partition(a,s,t);
quicksort(a,s,i-1);
quicksort(a,i+1,t);
}
}
3、选择排序
基本思想:
每趟排序从无序区中选择关键字最小的元素,将它与无序区中的第一个元素交换,使其有序中增加了一个元素
代码:
void selectsort(int a[],int n)
{
int i,j,k;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(a[j]<a[k])
k=j;
if(k!=i)
swap(a[i],a[k]);
}
}