交换排序(冒泡排序,快速排序)

版权声明:本文为博主原创文章,转载时请注明文章出处和作者! https://blog.csdn.net/sb985/article/details/79903187

交换排序

冒泡排序

冒泡排序算法:顾名思义,就是将最重的(最大元素)浮动到最下面,最轻的(最小元素)浮动到最上面.
算法过程:
1.循环数组长度length-1次,下标为i.
因为每次循环后就会出现一个最大(升序)或最小(降序),只需要比较n-1就行
1.1 在前 length-i个元素中循环因为已经有i个已经有序
1.1.2 比较当前元素与后一个元素的大小,如果前者比后者大交换(升序)

//冒泡排序
template <class T>
void BubbleSort(SqList<T> &L){
    //非降序排序
    T t;
    for(int i = 1;i < L.length; ++i){
        for(int j = 1;j <= L.length - i; ++j){
            if(L.key[j] > L.key[j+1]) {
                t = L.key[j];
                L.key[j] = L.key[j+1];
                L.key[j+1] = t;
            }//endif
        }//endfor
    }//endfor
}

注意:上述算法会对已经有序的部分也进行比较,这不是我们所想要的,可以想办法让已经有序的部分不在比较.
1.可以通过设置标志位,如果发生了交换,则把较大的已经放在后面了,后面的已经有序,不需要在比较后面一有序的部分了,直接进入下一次循环中即可.
2.也可以将上次交换的位置记住,交换后的是有序的,只需要比较交换位置前面的部分即可.
冒泡排序算法优化算法

快速排序

首先任意选取一个数据(通常选用数组的第一个数)作为枢轴,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
参考大神博客,大佬博客

int Partition(int L[],int low,int high){
    /*
     1.先从后向前分别与枢轴比较,交换,
     2.然后从前向后分别与枢轴比较,交换
    由于整个过程lwo一直在增加,high一直在减少,所以low<high保证所有元素都与此次所选的枢轴进行了比较,
    当low>=high此时在枢轴之前(后)的记录均不大(小)于它,(函数返回枢轴其所在位置)

     但是其他元素之前的相对关系没有确定,只是确地了其他元素与此次选定的枢轴之间的关系
     所以要对枢轴左右的元素递归使用此方法
     */
    int  pivo;//枢轴
    L[0] = L[low];  //用子表的第一个记录作枢轴记录
    pivo = L[low];

    while(low < high){      //从表的两端交替向中间扫描

        while(low < high && L[high] >= pivo){
            --high;
        }//endwhile
        L[low] = L[high];//将比枢轴小的移动至低端此元素参与小于枢轴的比较

        while(low < high && L[low] <= pivo){
            ++low;
        }//endwhile
        L[high] = L[low];//将比枢轴大的记录移至高端

    }//endwhile
    L[low] = L[0];  //枢轴记录到位
    return low;             //返回枢轴位置
}
void QSort(int L[],int low,int high){
    int mid;//接受枢轴位置
    if(low < high) {//if low equals high which means all elements had been traversed
        mid = Partition(L,low,high);
        QSort(L,low,mid-1);     //对低子表排序
        QSort(L,mid+1,high);    //对高子表排序
    }//endif
}

猜你喜欢

转载自blog.csdn.net/sb985/article/details/79903187