实验十一:排序

一、实验目的

掌握快速排序算法及其应用

二、实验预习

快速排序算法。

三、实验内容

 编写一个程序,实现快速排序算法,用相关数据进行测试,并输出各次划分后的结果。

要求:(1)输入数据从名为“test.txt”的文本文件中获得,文件数据格式如下文所述;(2)输出序列中的各数字宽度相等并且右对齐。

文件格式说明:

第一行:数字序列字符串(不含空格)

第二行:数字个数

其余每行(表示一个数):起位置 数字字符串长度

四,实验代码

一,用c语言编写

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 打印格式化后的数组
void print_formatted(int *arr, int size) {
    int width = 0;
    for (int i = 0; i < size; i++) {
        int num_width = snprintf(NULL, 0, "%d", arr[i]);
        if (num_width > width) {
            width = num_width;
        }
    }

    for (int i = 0; i < size; i++) {
        printf("%*d", width, arr[i]);
        if (i < size - 1) {
            printf(" ");
        }
    }
    printf("\n");
}

// 快速排序中的划分函数
int partition(int *arr, int low, int high) {
    int pivot = arr[high];
    int i = low - 1;

    for (int j = low; j < high; j++) {
        if (arr[j] < pivot) {
            i++;
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }

    int temp = arr[i + 1];
    arr[i + 1] = arr[high];
    arr[high] = temp;

    return i + 1;
}

// 快速排序函数
void quicksort(int *arr, int low, int high) {
    if (low < high) {
        int pi = partition(arr, low, high);
        print_formatted(arr, high + 1); // 每次划分后输出数组
        quicksort(arr, low, pi - 1);
        quicksort(arr, pi + 1, high);
    }
}

// 读取输入文件并返回数据数组
int *read_input_file(const char *filename, int *length) {
    FILE *file = fopen(filename, "r");
    if (file == NULL) {
        perror("打开文件失败");
        exit(EXIT_FAILURE);
    }

    // 读取第一行
    char sequence[100];
    fscanf(file, "%s", sequence);

    // 读取第二行
    fscanf(file, "%d", length);

    // 读取剩余行
    int *data = (int *)malloc(*length * sizeof(int));
    for (int i = 0; i < *length; i++) {
        int start, num_len;
        fscanf(file, "%d %d", &start, &num_len);
        char number_str[10];
        strncpy(number_str, sequence + start, num_len);
        number_str[num_len] = '\0';
        data[i] = atoi(number_str);
    }

    fclose(file);
    return data;
}

// 主函数
int main() {
    const char *filename = "test.txt";
    int length;
    int *data = read_input_file(filename, &length);

    printf("原始序列:\n");
    print_formatted(data, length);
    printf("划分步骤:\n");
    quicksort(data, 0, length - 1);
    printf("排序后序列:\n");
    print_formatted(data, length);

    free(data);

    return 0;
}

三,输出示例 

原始序列:
503  87 512  61 908 170 897 275 653 462
划分步骤:
 87  61 170 275 462 512 897 503 653 908
 87  61 170 275 462 512 897 503 653 908
 87  61 170 275 462 512 897 503 653 908
 61  87 170 275 462 512 897 503 653 908
 61  87 170 275 462 512 897 503 653 908
 61  87 170 275 462 512 503 653 897 908
 61  87 170 275 462 503 512 653 897 908
排序后序列:
 61  87 170 275 462 503 512 653 897 908

五,编写思路

  1. 读取输入文件:程序首先打开名为“test.txt”的文件,并按照特定的格式读取文件内容。该文件包含了要排序的数字序列字符串以及数字个数信息。通过C语言中的fopenfscanf,或者C++语言中的ifstream和流操作符>>来读取文件内容。

  2. 解析输入数据:读取文件后,根据文件格式,程序解析数字序列字符串和数字个数信息。将数字序列字符串按照给定的起始位置和数字字符串长度提取出各个数字,并将其转换为整数类型存储在数组或向量中。

  3. 快速排序算法实现:采用快速排序算法对读取并解析后的数据进行排序。快速排序算法由两个主要函数构成:partitionquicksortpartition函数选取一个枢轴元素(通常是最后一个元素),然后将数组分成两部分,小于枢轴元素的放在左边,大于等于枢轴元素的放在右边。quicksort函数递归地对分区进行排序,直到整个数组有序。

  4. 打印排序过程:在每次划分后,程序会输出数组或向量的当前状态,以便观察每一步排序的结果。输出是格式化的,确保数字对齐并宽度相等。

  5. 释放内存:在C语言程序中,使用了动态分配的内存,因此在程序结束前需要手动释放分配的内存空间。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值