排序算法—交换排序

122 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

前言

昨天分享了排序算法中插入排序,今天继续来总结交换排序。

交换排序

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

交换排序最经典的算法包括:

  1. 冒泡排序
  2. 快速排序

冒泡排序

基本思路:每趟不断将记录两两比较,并按“前小后大” (或“前大后小”)的规则交换。

例:T=(21,25,49,25*,16,08)

image.png

代码实现:

void bsort (int a[], int n) { 
    int temp,i,j;
    int flag; //交换标志
    for(j=1; j<=n-1;j++) { //最多做n-1趟排序
        flag=0; //本趟排序开始前,交换标志应为0 
        for(i=1;i<=n-j;i++){ //对当前无序区扫描
            if(a[i]>a[i+1]) { //交换记录
                temp=a[i];
                a[i]=a[i+1];
                a[i+1]=temp;
                flag=1; //发生了交换,故将交换标志置为真
            }
        }
        if(flag= =0) break; //本趟排序未发生交换,提前终止算法
    }
}

快速排序

基本思想:从待排序列中任取一个元素 (例如取第一个) 作为中心,所有比它小的元素一律前放,所有比它大的元素 一律后放,形成左右两个子表;然后再对各子表重新 选择中心元素并依此规则调整,直到每个子表的元素 只剩一个。此时便为有序序列了。

例: T=(21,25,49,25*,16,08)

排序过程的一部分如下:

image.png

快速排序的代码实现涉及递归的知识,目前还没有系统刷到递归,代码以后补上。

后记

接下来的几天里会写几篇文章一起总结排序算法,一起来学习排序算法吧!