排序——交换排序

2020-11-30  本文已影响0人  vavid

一、冒泡排序

从前往后,把大的往后换
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);
    }
}
上一篇下一篇

猜你喜欢

热点阅读