选择排序
1.简单选择排序
1.1算法描述
其基本思想就是:
第一步,在待排序的记录关键字a[1]——a[n]中选择最小(最大)记录,将它与a[1]交换;
第二步,在剩下的a[2]——a[n]中选择最小(最大)的记录,将它与a[2]交换;
第三步:以此类推,即可得出从小至大(从大至小)的数列。
1.2举例理解
初始数列:10 50 30 60 70 20
第一趟:选择数列中最小的数,即10,10在a[1]上,因此不需要交换,即:10 50 30 60 70 20
第二趟:从剩下的数中选择最小的数,即20,将20与a[2]交换,即:10 20 30 60 70 50
以此类推,得出序列为:10 20 30 50 60 70
1.3代码实现
#include <stdio.h>
int SelectSort(int a[],int n)
{
int i,j,wm,min;
for(i=0;i<n;i++)
{
min=i;
for(j=i+1;j<n;j++)
{
if(a[j]<a[min])
{
min=j;
}
}
if(min!=i)
{
wm=a[i];
a[i]=a[min];
a[min]=wm;
}
}
}
int main()
{
int i,a[]={10,50,30,60,70,20};
printf("排序前的数列:");
for(i=0;i<6;i++)
{
printf("%d ",a[i]);
}
SelectSort(a,6);
printf("排序后的数列:");
for(i=0;i<6;i++)
{
printf("%d ",a[i]);
}
return 0;
}
2.堆排序
堆排序是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
2.1算法描述
第一步:将无序序列构建成一个堆,自行选择大顶堆或小顶堆;
第二步:将堆顶元素与末尾元素交换,将最大元素放到数组末端;
第三步:重复执行第一、二步,直到整个序列有序。
2.2举例理解
(以大顶堆为例)
设初始无序序列为:2 6 8 3 7 9 5
对应的堆为:
2
6 8
3 7 9 5
构造大顶堆为:
9
7 8
3 6 2 5
即现在序列为:9 7 8 3 6 2 5
将堆顶元素与末尾元素交换,使末尾元素最大,则序列为:5 7 8 3 6 2 9(此时9为确定序列,此后只对剩下元素排序)
重新调整结构为:
8
7 5
3 6 2 9
堆顶元素与末尾元素交换,即现在序列为:2 7 5 3 6 8 9(此时8和9 都已确定)
重复上述步骤:
最终排序为:2 3 5 6 7 8 9
2
3 5
6 7 8 9
2.3代码实现
#include <stdio.h>
int a[]={2,6,8,3,7,9,5},n=7;
void Exchange(int i,int n)
{
int wm;
wm=a[i];
a[i]=a[n];
a[n]=wm;
}
void HeapSort(int n)
{
int i,s;
if(n==2)
{
if(a[0]>a[1])
{
printf("%d %d\n",a[0],a[1]);
}
else
printf("%d %d\n",a[1],a[0]);
return;
}
for(i=n/2-1;i>=0;i--)
{
if(a[2*i+1]>a[i]&&2*i+1<n)
Exchange(i,2*i+1);
if(a[2*i+2]>a[i]&&2*i+2<n)
Exchange(i,2*i+2);
}
s=a[0];
a[0]=a[n-1];
a[n-1]=s;
printf("%d ",a[n-1]);
HeapSort(n-1);
}
int main()
{
int i;
HeapSort(n);
return 0;
}