|
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5d036d5b3689737e4e0aae6696d19170.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d2a4ee0d21df50000077d7c79869b6aa.png)
前言
排序是计算机程序设计中一种重要的操作,排序的主要目的是为了便于查找。
提示:以下是本篇文章正文内容,下面案例可供参考
一、排序是什么?
排序是按照关键字的非递减或非递增序列对一组重新进行排列的操作。
排序分为:内部排序和外部排序
排序的稳定性:一组不规则的序列中有两个相同的数组(他们有前后之分),排之后他们的前后顺序不变,就称这种排序为稳定排序,反之为不稳定排序。
例如 1 2* 0 2排序之后为 0 1 2* 2我们就称排序这组数据的方法具有稳定性。
内部排序的分类:插入类,交换类,选择类,归并类,分配类。
待排序记录的存储方式:顺序表,链表,地址排序。
排序算法效率的评价指标:执行时间,辅助空间(时间复杂度由排序算法所需的辅助空间决定)。
二、排序
待排序记录的数据类型定义为:
#define MAX 20
typedef int KeyType;
typedef struct
{
KetType Key;
INfoType otherinfo;//其他数据类型
}RedType;
typedef struct
{
RedType r[MAX+1];//r[0]作为哨兵单元
int length;
}SqList;
1.直接插入排序
代码如下(示例):
void InsertSort(SqList &S)
{
int i,j;
for(i=2;i<=S.length;i++)
{
if(S.r[i].Key>S.r[i-1].Key)
{
S.r[0]=S.r[i].Key;
for(j=i-1;S.r[j].Key>S.r[0].Key;j--)
{
S.r[j+1].Key=S.[j].Key;
}
}
S.r[j+1].Key=S.r[0].Key;
}
}
2.折半插入排序
折半插入排序就是把直接插入的查找可覆盖位置换成折半查找
下列是升序排序
void HalfSort(SqList &S)
{
int i,j,low,high,mid;
for(i=2;i<=S.length;i++)
{
S.r[0].Key=S.r[i].Key;
low=1;
high=i-1;
while(low<=high)
{
mid=(low+high)/2;
if(S.r[mid].Key>S.r[0].Key)
{
high=mid-1;
}else
{
low=mid+1;
}
}
for(j=i-1;j>=high+1;i--)
{
S.r[j+1].Ket=S.[j].Key;
}
S.r[high1].Key=S.r[0].Key;
}//for
}
3.希尔排序
希尔排序又称缩小增量排序
4.选择排序
void SelectSort(SqList &S)
{
int i,j,temp;
int min;//最小值
for(i=1;i<=S.length-1;i++)
{
min=i;
for(j=i;i<=S.lentgh;j++)
{
if(S.r[j].key<S.r[min].key)
{
min=j;
}
}
if(min!=i)
{
temp=S.r[i].key;
S.r[i].key=S.r[min].Key;
}
}
}
5.堆排序
堆分为大顶堆和小顶堆
大顶堆用于降序排序
小顶堆用于降序排序
void AdjustHeap(SqList &S,int start,int end)
{
int c,f;//c和f分别是孩子和双亲结点结点的位置
int temp=S.r[start].Key;
f=start;
for(c=2*start;c<=end;c*=2)
{
if((c<end)&&S.r[c].Key<S.r[c+1].Key)
{
c++;
}
if(S.r[c].Key>S.r[c].Key)
{
brek;
}
S.r[f].Key=S.r[c].Key;;
f=c;
}
S.r[f].Key=temp;
}
void CrateHeap(SqList &S)
{
int i;
for(i=(S.length+1)/2;i>=1;i--)
{
AdjustHeap(S,i,S.length);
}
}
void HeapSort(SqList &S)
{
int i;
int temp;
CrateHeap(S);
for(i=S.length;i>=1;i--)
{
temp=S.r[1].Key;
S.r[1].Key=S.r[i].Key;
S.r[i].Key=temp;
printf("%d\t",S.r[i].temp);
AdjustHeap(S,1,i);
}
}
6.冒泡排序
void BubbleSort(SqList &S)
{
int i,j,flag,temp;
i=S.length;
flag=1;//flag=1说明这一次循环有数据交换
while((i>=1)&&flag==1)
{
flag=0;//默认数组是有序的
for(j=1;j<=S.length-i-1;j++)
{
if(S.r[j].Key>S.r[j+1].Key)
{
flag=1;//数据进行了比较
temp=S.r[j].Key;
S.r[j].Key=S.r[j+1].Key;
S.r[j+1].Key=temp;
}
}
i--;
}
}
7.快速排序
//将数组划分为两个区域
int partition(SqList &S,int low,int high)
{
S.r[0].Key=S.r[low].Key;
while(low<high)
{
while((low<high)&&S.r[high].Key>S.r[0].Key)
{
high--;
}
S.r[low].Key=S.r[high].Key;
while((low<high)S.r[low].Key<S.r[0].Key)
{
low++;
}
S.r[high].Key=S.r[low].Key;
}
S.r[low/high].Key=S.r[0].Key;
return low/high;
}
void QSort(SqList &S,int low,int high)
{
int mid;
while(low<high)
{
mid=Partition(S,low,high);
Partition(S,low,mid-1);
partition(S,mid+1,high);
}
}
void QucikSort(SqList &S)
{
QSort(S,1,S.length);
}