第八章 排序—选择排序
数据结构基础代码 (严蔚敏 人邮教育出版社)
简单选择排序
#include <stdio.h>
int selectionSort(int A[],int N)
{
int i,j,t,minj;
int sw=0;
for(i=0;i<N-1;i++)
{
minj=i;
for(j=i;j<N-1;j++)
{
if(A[j]<A[minj])
{
minj=j;
}
}
t=A[i];
A[i]=A[minj];
A[minj]=t;
sw++;
}
if(i!= minj)
{
sw++;
}
return sw;
}
int main()
{
int i,sw,N,A[100];
scanf("%d",&N);
for(i=0;i<N-1;i++)
{
scanf("%d",&A[i]);
}
sw=selectionSort(A,N);
for(i=0;i<N-1;i++)
{
if(i)
{
printf(" ");
}
printf("%d",A[i]);
}
printf("\n");
printf("%d\n",sw);
}
输出结果如下:
堆排序
#include <stdio.h>
#include <iostream>
using namespace std;
//堆排序
void HeapAdjust(int A[],int s,int m) //函数用来调整堆,使元素称为大根堆(将A[s...m]调整为以A[s]为根的大根堆。)
{
int v,j;
v=A[s]; //也可以用A[0]来做为关键字存储变量
for(j=2*s;j<=m;j*=2) //从A[s]较大的孩子结点向下查找。
{
if(j<m&&A[j]<A[j+1])// 比较当前s位置的两个孩子值的大小,用j表示最大的孩子结点下标。
{
++j;
}
if(v>=A[j]) //如果v大于较大的孩子结点的值,跳出循环。说明v的插入位置就是当前s的位置。
{
break;
}
A[s]=A[j]; //如果v并没有大于当前孩子结点的值,把v与当前孩子结点位置交换。并且继续比较
s=j; //与当前位置S值的两个孩子的值的大小,知道找到合适的插入位置再跳出循环。
}
A[s]=v; //v放置在位置s上
}
//建立初始堆
void CreatHeap(int A[],int N)
{
int i;
for(i=N/2;i>0;--i)
{
HeapAdjust(A,i,N);
}
}
//堆排序的实现
void HeapSort(int A[],int N)
{
int i,x;
CreatHeap(A,N);
for(i=N;i>1;--i)
{
x=A[1]; //用来把堆顶元素和堆尾元素交换,继续调整堆。
A[1]=A[i];
A[i]=x;
HeapAdjust(A,1,i-1); //输出堆顶元素后,对剩下的i-1个元素进行堆调整。
}
}
int main()
{
int A[100],N,i;
scanf("%d",&N);
for(i=1;i<N;i++) //从1号单元位置输入数据,0号位置我们不存数据。方便在调整堆时与孩子结点比较大小。
{
scanf("%d",&A[i]);
}
HeapSort(A,N);
for(i=1;i<N;i++) //输出时从包含数据元素位置输出。
{
if(i>0)
{
printf(" ");
}
printf("%d",A[i]);
}
return 0;
}
因为第一个位置A[0]我们不存值,所以输出的时候为了好看,第一个输入了空格。