【数据结构】多种简单排序方法的应用(C语言实现)

直接插入排序(改进算法)

程序代码:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

#include <malloc.h>

#define MAXSIZE 6

typedef int RedType;

struct SqList {

    RedType r[MAXSIZE + 1];

    int length;

};

void InitList(struct SqList* L) {

    L->length = 0;

}

void InsertList(struct SqList* L,RedType x) {

    L->r[L->length+1] = x;

    L->length++;

}

void PrintList(struct SqList* L) {

    for (int i = 1; i <= L->length; i++) {

         printf("%d\t", L->r[i]);

    }

}

void InsertSort(struct SqList* L) {

    for (int i = 2; i <= L->length; ++i) {

         L->r[0] = L->r[i];

         int j = i - 1;     

         while (L->r[0] < L->r[j]) {

             L->r[j+1] = L->r[j];

             --j;

         }

         L->r[j+1] = L->r[0];

    }

}

int main() {

    struct SqList* L = (struct SqList*)malloc(sizeof(struct SqList));

    InitList(L);

    printf("请依次输入%d个数据:\n", MAXSIZE);

    for (int i = 0; i < MAXSIZE; i++) {

         int t;

         scanf("%d", &t);

         InsertList(L, t);

    }

    printf("原顺序:\n");

    PrintList(L);

    printf("\n下面开始插入排序\n");

    InsertSort(L);

    printf("排序结果如下:\n");

    PrintList(L);

}

运行截图:

 

折半插入排序

程序代码:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

#include <malloc.h>

#define MAXSIZE 6

typedef int RedType;

struct SqList {

    RedType r[MAXSIZE + 1];

    int length;

};

void InitList(struct SqList* L) {

    L->length = 0;

}

void InsertList(struct SqList* L, RedType x) {

    L->r[L->length + 1] = x;

    L->length++;

}

void PrintList(struct SqList* L) {

    for (int i = 1; i <= L->length; i++) {

         printf("%d\t", L->r[i]);

    }

}

void BInsertSort(struct SqList* L) {

    for (int i = 2; i <= L->length; ++i) {

         L->r[0] = L->r[i];

         int low = 1;

         int high = i - 1;

         while (low <= high) {

             int mid = (low + high) / 2;

             if (L->r[0] < L->r[mid]) { high = mid - 1; }

             else { low = mid + 1; }

         }

         for (int j = i - 1; j >= low; j--) {

             L->r[j + 1] = L->r[j];

         }

         L->r[low] = L->r[0];

    }

}

int main() {

    struct SqList* L = (struct SqList*)malloc(sizeof(struct SqList));

    InitList(L);

    printf("请依次输入%d个数据:\n", MAXSIZE);

    for (int i = 0; i < MAXSIZE; i++) {

         int t;

         scanf("%d", &t);

         InsertList(L, t);

    }

    printf("原顺序:\n");

    PrintList(L);

    printf("\n下面开始折半插入排序\n");

    BInsertSort(L);

    printf("排序结果如下:\n");

    PrintList(L);

}

运行截图:

 

冒泡排序(改进算法)

程序代码:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

#include <malloc.h>

#define MAXSIZE 6

typedef int RedType;

struct SqList {

    RedType r[MAXSIZE + 1];

    int length;

};

void InitList(struct SqList* L) {

    L->length = 0;

}

void InsertList(struct SqList* L, RedType x) {

    L->r[L->length + 1] = x;

    L->length++;

}

void PrintList(struct SqList* L) {

    for (int i = 1; i <= L->length; i++) {

         printf("%d\t", L->r[i]);

    }

}

void BubbleSort(struct SqList* L) {

    int boolen = 1;

    int i = 1;

    int temp;

    while(i<L->length&&boolen){

         for (int j = L->length; j >i; j--) {

             if (L->r[j - 1] > L->r[j]) {

                  temp = L->r[j];

                  L->r[j] = L->r[j - 1];

                  L->r[j - 1] = temp;

                  boolen = 1;

             }

         }

         i++;

    }

}

int main() {

    struct SqList* L = (struct SqList*)malloc(sizeof(struct SqList));

    InitList(L);

    printf("请依次输入%d个数据:\n", MAXSIZE);

    for (int i = 0; i < MAXSIZE; i++) {

         int t;

         scanf("%d", &t);

         InsertList(L, t);

    }

    printf("原顺序:\n");

    PrintList(L);

    printf("\n下面开始冒泡排序\n");

    BubbleSort(L);

    printf("排序结果如下:\n");

    PrintList(L);

}

运行截图:

 

快速排序

程序代码:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

#include <malloc.h>

#define MAXSIZE 6

typedef int RedType;

struct SqList {

    RedType r[MAXSIZE + 1];

    int length;

};

void InitList(struct SqList* L) {

    L->length = 0;

}

void InsertList(struct SqList* L, RedType x) {

    L->r[L->length + 1] = x;

    L->length++;

}

void PrintList(struct SqList* L) {

    for (int i = 1; i <= L->length; i++) {

         printf("%d\t", L->r[i]);

    }

}

int Partition(struct SqList* L, int low, int high) {

    L->r[0] = L->r[low];

    int pivotkey = L->r[low];

    while (low < high) {

         while (low<high && L->r[high] >= pivotkey) {

             --high;

         }

         L->r[low] = L->r[high];

         while (low < high && L->r[low] <= pivotkey) {

             ++low;

         }

         L->r[high] = L->r[low];

    }

    L->r[low] = L->r[0];

    return low;

}

void QuickSort(struct SqList* L,int low,int high) {

    if (low < high) {

         int pivotloc = Partition(L, low, high);

         QuickSort(L, low, pivotloc - 1);

         QuickSort(L, pivotloc + 1, high);

    }

}

int main() {

    struct SqList* L = (struct SqList*)malloc(sizeof(struct SqList));

    InitList(L);

    printf("请依次输入%d个数据:\n", MAXSIZE);

    for (int i = 0; i < MAXSIZE; i++) {

         int t;

         scanf("%d", &t);

         InsertList(L, t);

    }

    printf("原顺序:\n");

    PrintList(L);

    printf("\n下面开始快速排序\n");

    QuickSort(L,1,L->length);

    printf("排序结果如下:\n");

    PrintList(L);

}

运行截图:

 

两路归并排序

程序代码:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

#include <malloc.h>

#define MAXSIZE 6

typedef int RedType;

struct SqList {

    RedType r[MAXSIZE+1];

    int length;

};

void InitList(struct SqList* L) {

    L->length = 0;

}

void InsertList(struct SqList* L, RedType x) {

    L->r[L->length+1] = x;

    L->length++;

}

void PrintList(struct SqList* L) {

    for (int i = 1; i <= L->length; i++) {

         printf("%d\t", L->r[i]);

    }

}

void Merge(RedType InitList[], int left, int right, RedType MergedList[]) {

    int i, j, k, mid;

    mid = (left + right) / 2;

    i = left; j = mid + 1; k = left;

    while (i <= mid && j <= right) {

         if (InitList[i] <= InitList[j]) {

             MergedList[k++] = InitList[i++];

         }

         else {

             MergedList[k++] = InitList[j++];

         }

    }

    while (i <= mid)

         MergedList[k++] = InitList[i++];

    while (j <= right)

         MergedList[k++] = InitList[j++];

}

void MSort(RedType InitList[],int left,int right,RedType MergedList[]){

    RedType TempList[MAXSIZE+1];

    int mid;

    if (left == right)

         MergedList[left] = InitList[left];

    else {

         mid = (left + right) / 2;

         MSort(InitList, left, mid, TempList);

         MSort(InitList, mid + 1, right, TempList);

         Merge(TempList, left, right, MergedList);

    }

}

void MergeSort(struct SqList* L) {

    MSort(L->r, 1, L->length, L->r);

}

void main() {

    struct SqList* L = (struct SqList*)malloc(sizeof(struct SqList));

    InitList(L);

    printf("请依次输入%d个数据:\n", MAXSIZE);

    for (int i = 0; i < MAXSIZE; i++) {

         int t;

         scanf("%d", &t);

         InsertList(L, t);

    }

    printf("原顺序:\n");

    PrintList(L);

    printf("\n下面开始归并排序\n");

    MergeSort(L);

    printf("排序结果如下:\n");

    PrintList(L);

}

运行截图:

 

实验小结

运用“哨兵”优化算法

“哨兵”是在循环或迭代算法中用来标志终止条件的值。哨兵查找算法的思路大致如下:

首先,判断0号下标元素是否和目标值相同,如果相同,直接返回0;如果不同,则我们将0号下标元素先保存起来,然后将目标值放到0号下标处;

然后,我们从后向前查找,如果和目标值相同,则结束循环,否则向前走。当下标为0时,会结束循环,因为0号下标是目标值;

查找完毕后,我们将前面保存的0号下标的值再还原回去;

最后判断是否大于0,如果大于0表示找到了,否则就是没找到。

归并排序的递归算法

将InitList[]中的记录用归并法排序后放在MergedList[]中,可分为下面三个步骤:

1.现将InitList[]中的前半段记录用归并法排序后放在TempList[]的前半段中。

2.再将InitList[]中的后半段记录用归并法排序后放在TempList[]的后半段中。

3.将TempList的前半段和后半段记录合并到MergedList[]中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秃头鸭鸭鸭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值