几种排序算法的C++实现


排序算法

本文提供五种常用的排序算法的C++实现方式

1. 直接插入排序

简介

每次将一个待排序的数据按照大小插入到前面已经排好序的适当位置,直到全部数据插入完成为止。

输入输出

输入:待排序数组与数组大小
输出:排序中数据比较次数、数据移动次数与排序后数组

C++实现

// 直接插入排序
void insertSort(ElemType array[], int n){
    cout << endl << "Direct insertion sort (from small to large)" << endl;
    int count_sort = 0, count_move = 0;
    int i, j, temp;
    for(i = 1; i < n; i++){
        temp = array[i];
        for(j = i - 1; temp < array[j]; j--){
            array[j + 1] = array[j];    // 所有符合规定元素后移
            count_move ++;
            count_sort ++;
            if(j == -1){
                break;  // 防止越界
            }
        }
        array[j + 1] = temp;    // 插入位置插入当前元素
    }
    printMatrix(array, n);	// 打印数组
    cout << "Number of data comparisons: " << count_sort << endl;
    cout << "Number of data moves: " << count_move << endl;
}

2. 折半排序

简介

利用折半查找的方法来查找插入的位置,然后再直接将需要插入的数据插入该位置即可

输入输出

输入:待排序数组与数组大小
输出:排序中数据比较次数、数据移动次数与排序后数组

C++实现

// 折半排序
void binaryInsertSort(ElemType array[], int n){
    cout << endl << "Half sort (from small to large)" << endl;
    int count_sort = 0, count_move = 0;
    int front, temp, end;
    for(int i = 1; i < n; i++){
        temp = array[i];
        front = 0; end = i - 1;
        while(front <= end){
            int mid;
            mid = (front + end) / 2;
            if(temp < array[mid]){
                count_sort ++;
                end = mid - 1;
            }else{
                count_sort ++;
                front = mid + 1;
            }
        }
        for(int j = i; j > front; j--){
            array[j] = array[j - 1];    // 所有元素后移
            count_move ++;
        }
        array[front] = temp;
        count_move ++;
    }
    printMatrix(array, n);	// 打印数组
    cout << "Number of data comparisons: " << count_sort << endl;
    cout << "Number of data moves: :" << count_move << endl;
}

3. 直接选择排序

简介

直接选择排序又称简单选择排序,是一种不稳定的排序方法,其是选择排序中最简单一种,其基本思想是:第 i 趟排序再待排序序列 a[i]~a[n] 中选取关键码最小的记录,并和第 i 个记录交换作为有序序列的第 i 个记录。

输入输出

输入:待排序数组与数组大小
输出:排序中数据比较次数、数据移动次数与排序后数组

C++实现

// 交换函数
void swap(ElemType array[], int i, int j){
    int temp = array[j];
    array[j] = array[i];
    array[i] = temp;
}

// 直接选择排序
void selectSort(ElemType array[], int n){
    cout << endl << "Straight selection sort (from small to large)" << endl;
    int count_sort = 0, count_move = 0;
    // 排序循环
    for(int i = 0; i < n - 1; i++){
        // 默认下标最小的数开始
        int temp_i = i;
        for(int j = i + 1; j < n; j++){
            // 比较大小,并交换下标
            count_sort ++;
            if(array[j] < array[temp_i]){
                temp_i = j;
            }
        }
        swap(array, temp_i, i); // 交换数据
        count_move ++;
    }
    printMatrix(array, n);	// 打印数组
    cout << "Number of data comparisons: " << count_sort << endl;
    cout << "Number of data moves: " << count_move << endl;
}

4. 快速排序

简介

先找到一个基准值key,通过一趟排序把待排序序列分为两部分,左边一部分为小于基准值的元素,右边一部分为大于基准值的元素。然后再循环分别对这两部分进行取基准值并排序,所以快速排序实际上是一个递归的过程,可以以此达到使整个序列变为有序序列。

输入输出

输入:待排序数组与数组大小
输出:排序中数据比较次数、数据移动次数与排序后数组

C++实现

// 全局变量
extern int quick_count_sort = 0;
extern int quick_count_move = 0;

// 交换函数
void swap(ElemType array[], int i, int j){
    int temp = array[j];
    array[j] = array[i];
    array[i] = temp;
}

// 快速排序
void quickSort(ElemType array[], int left, int right){
    if(left >= right)
        return;
    int i, j , base;
    i = left, j = right;
    base = array[left];
    while(i < j){
        while(array[j] >= base && i < j) {
            j--;
            quick_count_sort ++;
        }
        while(array[i] <= base && i < j) {
            i++;
            quick_count_sort ++;
        }
        if(i < j){
            swap(array, i, j);
            quick_count_move ++;
        }
    }
    array[left] = array[i];
    quick_count_move ++;
    array[i] = base;
    quick_count_move ++;
    quickSort(array, left, i-1);
    quickSort(array, i + 1, right);
}

// 实现相关输出的临时函数
void quickSortIn(ElemType array[], int left, int right){
    cout << endl << "Quick sort (from small to large)" << endl;
    quickSort(array, left, right);
    printMatrix(array, n);	// 打印数组
    cout << "Number of data comparisons: " << quick_count_sort << endl;
    cout << "Number of data moves: " << quick_count_move << endl;
}

归并排序

简介

归并排序采用分而治之的思想。分指的将待排序数组一分为二,不断递归处理,最终分割为两个元素的相互比较。和指的是将分割开来的数组,按照数值元素大小再合并起来,得到最后排序完成的数组

C++实现

// 合并列表
void mergeList(ElemType array[], int p, int q, int mid){
    int i = p, j = mid + 1, k = 0;
    // 申请空间
    int *newarray = (int *)malloc((q - p + 1)*sizeof(int));
    if(!newarray){
        cout << "MallocError" << endl;
    }
    while(i <= mid && j <= q){
        if(array[i] < array[j])
            newarray[k++] = array[i++];
        else
            newarray[k++] = array[j++];
    }
    while(i <= mid)
        newarray[k++] = array[i++];
    while(j <= q)
        newarray[k++] = array[j++];
    for(i = p, k=0; k<(q - p + 1); i++, k++)
        array[i] = newarray[k];
    free(newarray); // 释放空间
}

// 归并排序
void mergeSort(ElemType array[], int p, int q){
    if(p >= q)
        return;
    int mid = (int)((p + q) / 2);        // 取中值
    // 递归
    mergeSort(array, p, mid);
    mergeSort(array, mid+1, q);
    // 合并列表
    mergeList(array, p, q, mid);
}

总结

简单写出了五种排序算法与C++的实现方式,相关内容还有待增添。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值