C++排序实验

Posted 康小庄

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++排序实验相关的知识,希望对你有一定的参考价值。

1.给出已知的顺序线性表结构体如下所示:

#define MaxSize 50
typedef int ElemType;
typedef struct 
	ElemType data[MaxSize];
   	int length;
 SqList;

2.给出待排序记录的关键字序列为52, 49, 80, 36, 14, 58, 61, 23, 97, 75。

3.分别写出上述待排序记录的直接插入排序算法、冒泡排序算法和快速排序算法,并进行算法比较。

sort.cpp

#include <stdio.h>

#define MaxSize 50
typedef int ElemType;
typedef struct 
    int data[MaxSize];
    int length;
 SqList;

// 插入排序
void InsertSort(SqList *L) 
    int i, j;
    for (i = 2; i <= L->length; i++) 
        // 插入到有序子表
        if (L->data[i] < L->data[i - 1]) 
            // 待插入的记录暂存到监视哨中
            L->data[0] = L->data[i];
            // data[i-1] 后移
            L->data[i] = L->data[i - 1];
            // 从后向前寻找插入位置
            for (j = i - 2; L->data[0] < L->data[j]; j--) 
                // 记录逐个后移,直到找到插入位置
                L->data[j + 1] = L->data[j];
            
            // 将data[0]即原data[i],插入到正确位置
            L->data[j + 1] = L->data[0];
        
    


// 冒泡排序
void BubbleSort(SqList *L) 
    int i, j;
    for (i = 1; i <= L->length; i++) 
        for (j = 1; j <= L->length - i; j++) 
            if (L->data[j] > L->data[j + 1]) 
                int temp = L->data[j];
                L->data[j] = L->data[j + 1];
                L->data[j + 1] = temp;
            
        
    


int Partition(SqList *L, int low, int high) 
    // 用子表的第一个记录做枢轴记录
    L->data[0] = L->data[low];
    // 枢轴记录关键字保存在pivotkey中
    int pivotkey = L->data[low];
    // 从表的两端交替向中间扫描
    while (low < high) 
        while (low < high && L->data[high] >= pivotkey) 
            --high;
        
        // 将比枢轴记录小的记录移到低端
        L->data[low] = L->data[high];
        while (low < high && L->data[low] <= pivotkey) 
            ++low;
        
        // 将比枢轴记录大的记录移到高端
        L->data[high] = L->data[low];
    
    L->data[low] = L->data[0];
    return low;


void QuickSort(SqList *L, int low, int high) 
    if (low < high) 
        // 将L.data[low,high] 一分为二  pivotloc是枢轴位置
        int pivotloc = Partition(L, low, high);
        // 对左子表递归排序
        QuickSort(L, low, pivotloc - 1);
        // 对右子表递归排序
        QuickSort(L, pivotloc + 1, high);
    


// 快速排序
void QuickSort(SqList *L) 
    QuickSort(L, 1, L->length);



int main() 

    int a[] = 52, 49, 80, 36, 14, 58, 61, 23, 97, 75;
    int i, k;
    SqList s;
    printf("\\n待排序数据为:\\n");
    for (i = 1; i < 10; i++) 
        s.data[i] = a[i - 1];
        printf("%d  ", a[i - 1]);
    
    s.length = i - 1;
    printf("\\n1,插入排序\\n2,冒泡排序\\n3,快速排序\\n");
    printf("请输入序号\\n");
    scanf("%d", &k);
    switch (k) 
        case 1:
            //在此处调用插入函数
            InsertSort(&s);
            break;
        case 2:
            //在此处调用冒泡函数
            BubbleSort(&s);
            break;
        case 3:
            //在此处调用快速函数
            QuickSort(&s);
            break;
        default:
            printf("No function which you select.\\n");
    
    printf("\\n排序后的记录为\\n");
    for (i = 1; i < 9; i++)
        printf("%d  ", s.data[i]);

    printf("\\n");



运行截图


插入排序

冒泡排序

快速排序

以上是关于C++排序实验的主要内容,如果未能解决你的问题,请参考以下文章

对快速排序的理解以及相关c++代码

排序函数 C++

快速排序

C++ 快速排序段错误

如何在快速排序中选择枢轴值?

SDUT 3398 数据结构实验之排序一:一趟快排