简单选择排序(顺序存储、链式存储)、堆排序(顺序存储)
选择排序分为简单选择排序和堆排序。其基本思想是:每一趟(如第i趟)在后面n-i+1(i=1,2,…,n-1)个待排序元素中选关键字最小的元素,作为有序子序列的第i个元素,直到第n-1趟做完,待排序元素只剩下1个,就不用再选了。
简单选择排序
算法思想:假设排序表为L[1…n],第i趟排序即从L[i…n]中选取关键字最小的元素与L(i)交换,每一趟排序可以确定一个元素的最终位置,这样经过n-1趟排序就可以使得整个排序表有序。
顺序存储结构(数组)
/*
Title:简单选择排序(数组结构实现)
Author:F&S&L
Time:2020.11.30
*/
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
int A[MaxSize]; //初始化数组
int CreateA() //创建待排序数组A[]
{
int e,i=0;
printf("请输入你需要排序的元素(空格隔开,以999结束):");
while(1)
{
scanf("%d",&e);
if(e!=999) //当从键盘输入的元素不为999时,就存储到数组A[]中;反之,则结束输入
{
i++; //i记录的是待排序数组中元素的个数
A[i-1]=e;
}
else break;
}
return i-1; //返回的i-1表示的是待排序数组中最后一个元素的下标
}
void SelectSort(int rear) //简单选择排序函数,传入的参数rear表示的是最后一个元素的小标
{
int front=0,p,temp; //front是进行比较的第一个元素的位置,p是用来记录当前比较过程中最小元素的位置,temp是交换元素的盒子
while(front<rear) //结束循环的条件
{
p=front; //假设当前最小元素的front
for(int i=front+1;i<=rear;i++) //如果i位置的元素小于p位置元素的值,则将i赋给p
{
if(A[i]<A[p])
{
p=i;
}
}
temp=A[front]; //一趟之后,就进行元素交换,把最小元素赋给front位置,同时front+1,再进行下一趟
A[front]=A[p];
A[p]=temp;
front++;
}
}
void PrintfA(int rear) //打印数组A[]
{
for(int i=0;i<=rear;i++)
{
printf("%d ",A[i]);
}
printf("\n"