#include<stdio.h>
#define MAXSIZE 100
typedef int dataType;
typedef struct {
dataType key;
char name[5];
}Data;
typedef struct {
Data r[MAXSIZE + 1];
int length;
}SeqList;
//直接插入排序
int InsertSort(SeqList *L) {
int i = 2; //从第二个位置开始排序
if (L->length == 1)
{
return 1; //一个元素,不用排序
}
while (i <= L->length) {
if (L->r[i].key < L->r[i-1].key)
{ //如果当前i比它前一个元素小,则没有必要进行排序了
L->r[0] = L->r[i]; //将元素放入0号位置
int j = i - 1;
while (L->r[0].key < L->r[j].key) {
L->r[j + 1] = L->r[j]; //移动元素
j--;
}
L->r[j + 1] = L->r[0]; //将元素插入
}
i++;
}
return 1;
}
//冒泡排序法
int buble_sort(SeqList *L) {
int flag = 1;
for (int i = L->length; i >0 && flag == 1; i--)
{
flag = 0; //置标志域,当发生了交换,则设置为1,若一遍排序之后元素没发生交换,则说明元素有序
for (int j = 1; j < i; j++)
{ //进行冒泡排序算法
if (L->r[j].key >L->r[j+1].key)
{ //交换元素,将值较大的往后移
L->r[0] = L->r[j];
L->r[j] = L->r[j + 1];
L->r[j + 1] = L->r[0];
flag = 1;
}
}
}
return 1;
}
//快速排序法 最快的排序算法
int QKpass(SeqList *L,int low,int high) {
L->r[0] = L->r[low];
while (low < high) {
while (low < high&&L->r[high].key >= L->r[0].key) high--;
L->r[low] = L->r[high];
while (low < high && L->r[low].key < L->r[0].key) low++;
L->r[high] = L->r[low];
}
L->r[low] = L->r[0];
return low;
}
//快速排序,调用上面的处理过程
void QKSort(SeqList *L, int low, int high) {
int pos;
if (low < high)
{
pos = QKpass(L, low, high);
QKSort(L, 1, pos);
QKSort(L, pos+1, high);
}
}
//选择排序法
int selectSort(SeqList *L) {
Data temp;
for (int i = 1; i < L->length; i++)
{
int j = i;
for (int k = i+1; k <= L->length; k ++)
{ //内循环一个记录剩下元素最小值的下标
if (L->r[j].key > L->r[k].key)
{
j = k;
}
}
if (j != i)
{ //交换元素
temp = L->r[j];
L->r[j] = L->r[i];
L->r[i] = temp;
}
}
}
/***************************堆排序算法**********************************/
//调整顶堆
void HeapAdjust(SeqList *L, int s, int m) {
//已知L->r[s..m]中记录关键字除L->r[s].key之外均满足堆的定义
//调整L->r[s]使之成为一个小顶堆
Data t = L->r[s];
for (int i = s*2; i <= m; i*=2)
{
if (i<m && (L->r[i].key > L->r[i+1].key))
{ //找出左右子树当中最小的key的下标值
i++;
}
if (t.key <= L->r[i].key)
{ //当前堆顶元素比左右子树的key都小,则不用做调整
break;
}
//对元素位置进行调整,使之成为一个堆
L->r[s] = L->r[i];
s = i; //进入下一层子树
}
//在循环内部对s做了修改,s指向的是当前堆顶的最后一个叶子结点
L->r[s] = t;
}
//创建顶堆
void CreateHeap(SeqList *L) {
for (int i = L->length/2; i > 0; i--)
{
HeapAdjust(L, i, L->length);
}
}
//准备工作完成,开始进行堆排序
void HeapSort(SeqList *L) {
CreateHeap(L); //创建顶堆
for (int i = L->length; i>1; i--)
{ //破坏堆顶结构,使之重新调整,然后每次循环将最后一位剪枝
L->r[0] = L->r[1];
L->r[1] = L->r[i];
L->r[i] = L->r[0];
HeapAdjust(L, 1, i-1);
}
}
//显示元素值
void displaySeqList(SeqList L) {
printf("元素的值如下:\n");
for (int i = 1; i <= L.length; i++)
{
printf("%d\t", L.r[i].key);
}
}
//初始化
int initSeqList(SeqList *L) {
L->length = 0;
return 1;
}
//创建序列
void create_SeqList(SeqList *L) {
printf("请输入元素个数:\n");
scanf("%d", &(L->length));
for (int i = 1; i <= L->length; i++)
{
printf("请输入第%d个元素:\n",i);
scanf("%d", &(L->r[i].key));
}
}
main() {
SeqList L;
initSeqList(&L);
create_SeqList(&L);
HeapSort(&L); //自己更换排序的函数调用,这里使用的是堆排序,其它排序函数已经写好
displaySeqList(L);
}
各种经典排序算法的实现C语言版本,可直接使用(加必要的文字说明)
最新推荐文章于 2022-08-22 20:40:50 发布