【数据结构】-内部排序(交换排序)

灰太狼 2022-11-25 11:51 277阅读 0赞

内部排序-交换排序

  • 写在前面
  • 1.头文件及类型定义
  • 2.函数声明
  • 3.基本操作
    • 3.1 冒泡排序
      • 3.1.1 交换
      • 3.1.2 冒泡主过程
    • 3.2 快速排序
      • 3.2.1 划分
      • 3.2.2 快排主过程
  • 4.main函数
  • 5.小结

写在前面

【说明】以下代码实现最终均为递增序列,即从小到大排序。

1.头文件及类型定义

  1. #include<stdio.h>
  2. #define ElemType int

2.函数声明

  1. /*函数声明*/
  2. void swap(int& a, int& b); //1-1.交换
  3. void BubbleSort(ElemType A[], int n); //1-2.冒泡排序
  4. int Partition(ElemType A[], int low, int high); //2-1.划分
  5. void QuickSort(ElemType A[], int low, int high); //2-2.快速排序

3.基本操作

3.1 冒泡排序

3.1.1 交换

  1. //1-1.交换
  2. void swap(int& a, int& b) {
  3. //涉及两个元素实际交换,要带引用
  4. int temp = a;
  5. a = b;
  6. b = temp;
  7. }

3.1.2 冒泡主过程

  1. //1-2.冒泡排序
  2. void BubbleSort(ElemType A[], int n) {
  3. for (int i = 0; i < n - 1; i++) {
  4. //若每趟均要交换,则共n-1趟冒泡
  5. bool flag = false; //代表本趟冒泡是否发生交换的标志
  6. for (int j = n - 1; j > i; j--) //一趟冒泡过程
  7. if (A[j - 1] > A[j]) {
  8. //若为逆序
  9. swap(A[j - 1], A[j]); //交换
  10. flag = true; //更改标志位,本趟发生交换
  11. }
  12. if (flag == false)
  13. return; //本趟遍历没有发生交换,说明表已经有序,提前结束算法
  14. }
  15. }

3.2 快速排序

3.2.1 划分

  1. //2-1.划分
  2. int Partition(ElemType A[], int low, int high) {
  3. //一趟划分
  4. ElemType pivot = A[low]; //将表中第一个元素作为枢轴
  5. while (low < high) {
  6. //用low和high搜索枢轴的最终位置
  7. while (low < high && A[high] >= pivot)
  8. high--;
  9. A[low] = A[high]; //比枢轴小的元素移动到左端
  10. while (low < high && A[low] <= pivot)
  11. low++;
  12. A[high] = A[low]; //比枢轴大的元素移动到右端
  13. }
  14. A[low] = pivot; //枢轴元素存放到最终位置
  15. return low; //返回存放枢轴的最终位置
  16. }

3.2.2 快排主过程

  1. //2-2.快速排序
  2. void QuickSort(ElemType A[], int low, int high) {
  3. if (low < high) {
  4. //递归跳出的条件
  5. int pivotpos = Partition(A, low, high); //划分
  6. QuickSort(A, low, pivotpos - 1); //依次对两个子表进行递归排序
  7. QuickSort(A, pivotpos + 1, high);
  8. }
  9. }

4.main函数

  1. int main() {
  2. //1.冒泡排序
  3. ElemType A[] = {
  4. 10,9,8,7,6,5,4,3,2,1 };
  5. BubbleSort(A, 10);
  6. for (int i = 0; i < 10; i++)
  7. printf("%d\t", A[i]);
  8. printf("\n");
  9. //2.快速排序
  10. ElemType B[] = {
  11. 10,9,8,7,6,5,4,3,2,1 };
  12. QuickSort(B, 0, 9);
  13. for (int i = 0; i < 10; i++)
  14. printf("%d\t", B[i]);
  15. return 0;
  16. }

5.小结

一、交换排序的概念

  • 主要分两步:
    ① 比较:从头到尾比较,最小的放到队头(以递增为例)。
    ② 交换

二、关于两种交换排序的性能分析

  1. 冒泡排序
    空间复杂度:O(1)
    时间复杂度:O(n2)
    稳定性:稳定
    适用性:适用于顺序存储和链式存储的线性表
  2. 快速排序
    ①空间复杂度=O(递归层数)
    -—->最好情况:O(log2n)
    -—->最坏情况:O(n)
    -—->平均情况:O(log2n)
    ②时间复杂度=O(n*递归层数)
    -—->最好情况:O(nlog2n)
    -—->最坏情况:O(n2)
    -—->平均情况:O(nlog2n)
    稳定性:不稳定
    适用:仅适用于顺序存储的线性表
    【注】:快速排序在所有内部排序算法中平均性能最优

三、其他说明

  1. 冒泡排序较为简单,重点掌握快速排序,并且手写代码
  2. 交换排序的重要特点
    (1) 对冒泡排序来说,每经过一趟冒泡则必有一个元素会放在其最终的位置上
    (2) 对快速排序来说
    ①经过一次划分,则会有一个元素会放在其最终的位置上
    ②经过一趟排序,如果枢轴靠边,则第二趟排序会有一个元素会放在其最终的位置上;若枢轴不靠边,则第二趟会有两个元素确定其最终的位置。
    上述特点可作为判断是否进行了冒泡排序或快速排序以及进行了几趟的依据

发表评论

表情:
评论列表 (有 0 条评论,277人围观)

还没有评论,来说两句吧...

相关阅读

    相关 数据结构交换排序

    交换排序的基本思想是: 两两比较待排序记录的关键字,如果发生逆序(即排列顺序与排序后的次序正好相反),则交换之,直到所有记录都排好序为止。 冒泡排序 基本思路:每趟不