选择排序
选择排序的基本思想是:每一趟在待排序元素中选取关键字最小(或最大)的元素加入有序子序列。
简单选择排序
概念
假设排序表为L[1…N],,第i趟排序即从L[1…N]中选择关键字最小的元素与L(i)交换,每一趟排序可以确定一个元素的最终位置,这样经过n-1趟排序就可以使得整个排序表有序。
算法实现
void select_sort(ElemType A[],int n)
{
int i, j,min;
for (i = 0; i < n-1; i++)
{
min = i; // 记录最小元素位置
for (j = i + 1; j < n; j++) //在A【i...n-1】中选取最小的元素
if (A[j] < A[min])
min = j; //更新最小元素位置
if (min != i)
swap(A[i],A[min]);
}
}
堆排序
概念
算法实现
void Build_Max_Heap(ElemType A[],int len)
{ //构建大根堆
int i;
for (int i = len / 2; i > 0; i--) //从i=[n/2]~1,反复调整堆
HeadAdjust(A,i,len);
}
void HeadAdjust(ElemType A[],int k,int len)
{//将元素k为根的子树进行调整
int i;
A[0] = A[k]; //A[0]暂存子树的根节点
for (i = 2 * k; i <= len; i*=2) //沿key较大的子节点向下筛选
{
if (i < len && A[i] < A[i + 1])
{
i++; //取较大的子节点的下标
}
if (A[0] >= A[i])
break; //筛选结束
else
{
A[k] = A[i];//将A[i]调整到双亲结点上
k = i;//修改k值,以便继续向下筛选
}
}
A[k] = A[0]; //被筛选结点的值放入最终位置
}
void Heap_Sort(ElemType A[],int len)
{//堆排序
int i;
Build_Max_Heap(A,len);//初始建堆
for (i = len; i > 1; i++) //n-1趟的交换和建堆过程
{
swap(A[i],A[1]); //输出堆顶元素(和堆底元素互换)
HeadAdjust(A,1,i-1);//调整,把剩余的i-1个元素整理成堆
}
}
物联网知识
点个在看你最好看