美文网首页
排序——交换排序

排序——交换排序

作者: vavid | 来源:发表于2020-11-30 15:49 被阅读0次

    一、冒泡排序

    从前往后,把大的往后换
    i 记录当前一趟排序结束后,最大元素应该存储的位置
    j 指示每一趟排序中的当前元素,当该元素比其前一个元素进行对比,如果前一个元素比该元素大,则交换位置,直到一趟比较完成

    void BubbleSort(int R[], int len){
        int flag, temp;
        for(int i = len - 1; i >= 1; i-- ){
            flag = 0;
            for(int j = 1; j <= i; ++j){
                if(R[j-1] > R[j]){
                    temp = R[j];
                    R[j] = R[j-1];
                    R[j-1] = temp;
                    flag = 1;
                }
            }
            if(flag == 0){ // 排序一趟若未发生交换,则证明序列有序,排序结束
                return;
            }
        }
    }
    

    二、快速排序

    取第一个元素作为枢轴元素,遍历后面的序列,依次比较,比枢轴元素的大的往后移动,比枢轴元素小的往前移动。
    初始序列:
    \color{red}{49} 38 65 97 76 13 27 \underline{49}
    选第一个元素49作为枢轴元素,排序过程如下:

    希尔排序过程
    一趟排序结束:27 38 13 \color{red}{49} 76 97 65 \underline{49}
    可以看出,一趟排序之后,初始序列被枢轴元素划分为两个子序列,分别再对两个子序列进行递归的快速排序,经过几趟之后,最终会得到有序序列。每趟排序对子序列的划分都是一次排序,这样一趟结束后就有一个关键字到达最终的位置。
    void quickSort(int R[], int low, int high){
        int temp;
        int i = low; j = high;
        if(low < high){
            temp = R[low]; // 选定序列中第一个元素作为枢轴元素,并将该元素暂存下来
            while(i < j && R[j] >= temp){
                --j; // 从后往前找到第一个不小于枢轴元素的元素
            }
            if(i < j){
                R[i] = R[j]; // 将当前这个较小的元素往前换
                ++i; // i所在位置的元素已被覆盖,i后移一位,j指针暂停
            }
            while(i < j && R[i] < temp){
                ++i; // 同理,从前往后找到一个大于枢轴元素的元素
            }
            if(i < j){
                R[j] = R[i]; // 将当前这个较大的元素往后换
                --j; // j所在位置的元素已被覆盖,j前移一位,i指针暂停
            }
            R[i] = temp; // i,j两个指针相遇,将枢轴元素放入i,j指针所指的位置
            quickSort(R, low, i-1); // 再依次遍历枢轴元素左右的两个子序列
            quickSort(R, i+1, high);
        }
    }
    

    相关文章

      网友评论

          本文标题:排序——交换排序

          本文链接:https://www.haomeiwen.com/subject/olegvktx.html