一、直接(简单)选择排序
1.思路
每趟排序在当前待排序序列中选出关键码最小的记录,添加到有序序列中。
2.代码
void selectsort(int r[],int n)
{
int i,j,min,t;
for(i=0;i<n-1;i++)
{
min=i;
for(j=i+1;j<n;j++)
if(r[j]<r[min])
min=j;
if(min!=i)
{
t=r[i];r[i]=r[min];r[min]=t;
}
}
}
3.性能
比较次数 (n-1+1)*(n-1) / 2 = O(n * 2)
二、堆排序
1、思想
每次构造一个堆(堆就是完全二叉树),将堆的根节点(最大值或最小值)添加到有序序列中。
堆是具有下列性质的完全二叉树:
- 小根堆:每个结点的值都小于或等于其左右孩子结点的值
- 大根堆:每个结点的值都大于或等于其左右孩子结点的值
步骤
1、从下往上、从右到左 使根节点数据大于左右子树(左右子树大小不用管)使数据基本有序
2、处理对顶记录:r[ 1 ] 与r [n-k+1] 元素交换 ,把最大的元素放最后,进入有序区
3、调整剩余记录 : 此时剩余记录有n-k个(把最大的调到最后不管), sift(r,1,n-k)
2、代码
#include <stdio.h>
#include <stdlib.h>
void shift(int r[],int k,int end)
{
int i,j,t;
i=k;
j=2*i;
while(j<=end)
{
if(j<end && r[j]<r[j+1])
j++;
if(r[i]<r[j])
{
t=r[i];r[i]=r[j];r[j]=t;
}
i=j;
j=2*i;
}
}
void Heapsort(int r[],int n) //数据从1开始储存
{
int k,t;
for(k=n/2;k>=1;k--) //初建堆
shift(r,k,n);
for(k=1;k<n;k++)
{
t=r[1];r[1]=r[n-k+1];r[n-k+1]=t; //移走堆顶元素
shift(r,1,n-k); //重建堆
}
}
int main()
{
int a[9]={0,32,20,62,5,24,68,2,88}; //第一个0是占位的
Heapsort(a,8);
for(int j=1;j<9;j++)
printf("%d ",a[j]);
return 0;
}
3、性能
时间复杂度 O(nlogn)
来源B站懒猫老师,这个老师将得非常好,建议友友们去看看。