排序算法——交换类排序

博客介绍了排序的分类,包括内部排序和外部排序。着重讲解交换类排序,如冒泡排序,通过相邻元素交换使序列有序,还提及优化方法;快速排序则通过交换不相邻元素,可能消除多个逆序,介绍了其算法思想和步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

根据排序时数据所占用存储器的不同,可将排序分为两类,一类是整个排序过程完全在内存中进行,成为内部排序。另一类是由于待排序记录数据太大,内存无法容纳全部数据,需要借助外部存储才能完成,称为外部排序。

按照方法可以分为交换类排序和插入类排序。

先看下交换类排序,它的思想是通过一系列交换逆序元素进行排序的方法。

1、冒泡排序(相邻比序法)

算法思想:它通过对相邻的数据元素进行交换,逐步将待排序序列变成有序序列的过程。

                  反复扫描待排序记录序列,在扫描的过程中顺次比较相邻的两元素的大小,若逆序就交换位置。

算法描述:

void bubbleSort(int arr[],int length){
//对记录数组r做冒泡排序,length为数组的长度
    for (int i=0;i<length-1;i++){//确定排序趟数
        for(int j=0;j<length-1-i;j++){//确定比较次数
            if (arr[j]>arr[j + 1])
	    {
	    //交换
		int tmp = arr[j];
		arr[j] = arr[j + 1];
		arr[j + 1] = tmp;
	    }


        }        
    
    }

}

还可以对冒泡排序进行优化,比如可以在交换的地方加一个标记,如果那一趟排序没有交换元素,说明这组数据已经有序,不用再继续下去。或者我们可以记下最后一次交换的位置,后边没有交换,必然是有序的,然后下一次排序从第一个比较到上次记录的位置结束即可。可以参考博客

冒泡排序是一种稳定的排序方法。

2、快速排序

冒泡排序比较的是两个相邻元素,因此在互换两个相邻元素时候只能消除一个逆序。快速排序通过交换两个不相邻元素,可能消除多个逆序。

算法思想:

              从待排序记录序列中选取一个记录(通常是第一个)作为枢轴,其关键字设为K1,然后将其余关键字小于K1的记录移动到前面,关键字大于K1的移动到后面,结果将待排序记录分成两个子表,最后将关键字为K1的记录插到分界线的位置处。这个过程称为一趟快速排序。

算法步骤:

              假设待划分序列为 r[left],r[left+1],....,r[right],具体实现过程,可以设两个指针i和j,它们的初值分别是left和right。首先将基准记录r[left]移至变量x中,然后反复进行下两步,直到i和j相遇。

               1、i从左向右扫描直到r[i]>x时,将r[i]移至空单元r[j],此时r[i]相当于空单元;

               2、j从右向左扫描直到r[j]<x时,将r[j]移至空单元r[i],此时r[j]相当于空单元;

               当i和j相遇的时候,给空单元赋值x,然后对于左右形成的两个子表采用同样的方法进一步划分。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值