数据结构实验报告-排序

     

一、实验名称

实验8 排序

二、实验内容:

分别采用直接插人排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序等排序算法对简单的整型数组进行排序,并输出排序结果。

源码:
#include <iostream>

#include <vector>

using namespace std;

// 直接插入排序

void insertionSort(vector<int>& arr) {

    int n = arr.size();

    for (int i = 1; i < n; i++) {

        int key = arr[i];

        int j = i - 1;

        while (j >= 0 && arr[j] > key) {

            arr[j + 1] = arr[j];

            j--;

        }

        arr[j + 1] = key;

    }

}

// 希尔排序

void shellSort(vector<int>& arr) {

    int n = arr.size();

    for (int gap = n / 2; gap > 0; gap /= 2) {

        for (int i = gap; i < n; i++) {

            int temp = arr[i];

            int j = i;

            while (j >= gap && arr[j - gap] > temp) {

                arr[j] = arr[j - gap];

                j -= gap;

            }

            arr[j] = temp;

        }

    }

}

// 冒泡排序

void bubbleSort(vector<int>& arr) {

    int n = arr.size();

    for (int i = 0; i < n - 1; i++) {

        for (int j = 0; j < n - i - 1; j++) {

            if (arr[j] > arr[j + 1]) {

                swap(arr[j], arr[j + 1]);

            }

        }

    }

}

// 快速排序

void quickSort(vector<int>& arr, int low, int high) {

    if (low < high) {

        int pivot = arr[low];

        int i = low, j = high;

        while (i < j) {

            while (i < j && arr[j] >= pivot) j--;

            arr[i] = arr[j];

            while (i < j && arr[i] <= pivot) i++;

            arr[j] = arr[i];

        }

        arr[i] = pivot;

        quickSort(arr, low, i - 1);

        quickSort(arr, i + 1, high);

    }

}

// 简单选择排序

void selectionSort(vector<int>& arr) {

    int n = arr.size();

    for (int i = 0; i < n - 1; i++) {

        int min_idx = i;

        for (int j = i + 1; j < n; j++) {

            if (arr[j] < arr[min_idx]) {

                min_idx = j;

            }

        }

        swap(arr[i], arr[min_idx]);

    }

}

// 堆排序

void heapify(vector<int>& arr, int n, int i) {

    int largest = i;

    int left = 2 * i + 1;

    int right = 2 * i + 2;

    if (left < n && arr[left] > arr[largest]) {

        largest = left;

    }

    if (right < n && arr[right] > arr[largest]) {

        largest = right;

    }

    if (largest != i) {

        swap(arr[i], arr[largest]);

        heapify(arr, n, largest);

    }

}

void heapSort(vector<int>& arr) {

    int n = arr.size();

    for (int i = n / 2 - 1; i >= 0; i--) {

        heapify(arr, n, i);

    }

    for (int i = n - 1; i >= 0; i--) {

        swap(arr[0], arr[i]);

        heapify(arr, i, 0);

    }

}

// 归并排序

void merge(vector<int>& arr, int l, int m, int r) {

    int n1 = m - l + 1;

    int n2 = r - m;

    vector<int> L(n1), R(n2);

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

        L[i] = arr[l + i];

    }

    for (int j = 0; j < n2; j++) {

        R[j] = arr[m + 1 + j];

    }

    int i = 0, j = 0, k = l;

    while (i < n1 && j < n2) {

        if (L[i] <= R[j]) {

            arr[k] = L[i];

            i++;

        }

        else {

            arr[k] = R[j];

            j++;

        }

        k++;

    }

    while (i < n1) {

        arr[k] = L[i];

        i++;

        k++;

    }

    while (j < n2) {

        arr[k] = R[j];

        j++;

        k++;

    }

}

void mergeSort(vector<int>& arr, int l, int r) {

    if (l < r) {

        int m = l + (r - l) / 2;

        mergeSort(arr, l, m);

        mergeSort(arr, m + 1, r);

        merge(arr, l, m, r);

    }

}

int main() {

    vector<int> arr = { 64, 25, 12, 22, 11 };

    cout << "原始数组:";

    for (int num : arr) {

        cout << num << " ";

    }

    // 调用各种排序算法

    insertionSort(arr);

    // shellSort(arr);

    // bubbleSort(arr);

    // quickSort(arr, 0, arr.size() - 1);

    // selectionSort(arr);

    // heapSort(arr);

    // mergeSort(arr, 0, arr.size() - 1);

    cout << "\n排序结果:";

    for (int num : arr) {

        cout << num << " ";

    }

    cout << endl;

    return 0;

}

理论篇的代码都是以整型数组作为测试数据,这样既简单又能够表达算法流程,但在实际应用中往往面临更复杂的数据类型。假设有一个存放学生姓名信息的字符串数组,实验要求对这些姓名信息利用多种排序方法的相关算法进行排序。

提示:

(1)对姓名按照汉字的汉语拼音排序,比如“张三”(ZhangSan)和“李四”(LiSi)。从首字母按照a-z的字母顺序比较,比较时可以不分大小写,首字母相同,则继续比较后续字母。

(2)对于“张三”和“张三丰”这种情况,名字短的排在前面。

源码:
#include <iostream>

#include <vector>

#include <algorithm>

#include <cstring>

using namespace std;

// 汉语拼音排序比较函数

bool cmpPinyin(const string& a, const string& b) {

    return _stricmp(a.c_str(), b.c_str()) < 0;

}

// 长度排序比较函数

bool cmpLength(const string& a, const string& b) {

    if (a.length() == b.length()) {

        return cmpPinyin(a, b);

    }

    return a.length() < b.length();

}

int main() {

    vector<string> names = { "ZhangSan", "LiSi", "ZhangSanFeng", "WangWu", "ZhaoLiu", "ChenQi" };

    cout << "原始姓名信息:";

    for (const string& name : names) {

        cout << name << " ";

    }

    cout << endl;

    // 按照汉语拼音排序

    sort(names.begin(), names.end(), cmpPinyin);

    cout << "按照汉语拼音排序结果:";

    for (const string& name : names) {

        cout << name << " ";

    }

    cout << endl;

    // 按照长度排序

    sort(names.begin(), names.end(), cmpLength);

    cout << "按照长度排序结果:";

    for (const string& name : names) {

        cout << name << " ";

    }

    cout << endl;

    return 0;

}

三、心得体会:

在进行学生姓名信息排序的实验中,我深刻体会到排序算法的重要性和灵活运用的必要性。通过汉语拼音和长度两种不同的排序方法,可以让姓名信息按照不同的规则得到排序,展现了算法对数据处理的灵活性。在实际编码过程中,需要灵活运用字符串比较函数,比如 `_stricmp`,解决了在不同平台下函数调用的问题。同时,对排序算法效率和稳定性的思考也是必不可少的,避免了潜在的错误。通过这次实验,我不仅学会了如何实现排序算法,更深刻理解了算法设计的重要性,以及在实际项目中如何根据需求选择合适的算法来解决问题。这次实验不仅提升了我的编程能力,也增进了对算法原理的理解。

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值