25考研数据结构复习·8.1插入排序·8.2交换排序

目录

排序的基本概念

插入排序

直接插入排序/折半插入排序

希尔排序

交换排序

冒泡排序

算法原理

性能

👩‍💻 快速排序


排序的基本概念

  1. 排序:将各元素按关键字递增/或递减顺序重新排列
  2. 评价指标
    1. 稳定性:关键字相同的元素经过排序后相对顺序是否会改变
    2. 时间复杂度、空间复杂度
  3. 分类
    1. 内部排序:数据都在内存中
    2. 外部排序:数据太多,无法全部放入内存

插入排序

直接插入排序/折半插入排序

  1. 算法思想:每次将一个待排序的记录按其关键字大小插入到前面已排好序的子序列中,直到全部记录插入完成。
  2. 直接插入排序:顺序查找找到插入的位置,适用于顺序表、链表
  3. 折半插入排序:折半查找找到应插入的位置,仅适用于顺序表
    1. 👩‍💻 注意:一直到low>high时才停止折半查找。当mid所指元素等于当前元素时,应继续令low = mid + 1,以保证“稳定性”。最终应将当前元素插入到low所指位置(即high + 1)
  4. 性能
    1. 空间复杂度 o(1)
    2. 时间复杂度
      1. 最好:原本有序O(n)
      2. 最坏:原本逆序O(n^2)
      3. 平均:O(n^2)
    3. 稳定性:稳定

希尔排序

  1. 先将待排序表分割成若干形如L[i,i+d,i+2d,…,i+kd]的“特殊”子表,对各个子表分别进行直接插入排序。缩小增量d,重复上述过程,直到d=1为止
  2. 性能
    1. 时间复杂度:当n在某个特定范围时,约为O(n^{1.3})
    2. 空间复杂度:O(1)
    3. 稳定性:不稳定
    4. 适用性:仅可用于顺序表
  3. 👩‍💻 高频题型:给出增量序列,分析每一趟排序后的状态

交换排序

冒泡排序

算法原理

  1. 从后往前(或从前往后)两两比较相邻元素的值,若为逆序,则交换它们,直到序列比较完。称这样过程为“一趟”冒泡排序。最多只需n-1趟排序
  2. 每一趟排序都可以使一个元素的移动到最终位置,已经确定最终位置的元素在之后的处理中无需再对比
  3. 👩‍💻 如果某一趟排序过程中未发生“交换”,则算法可提前结束

性能

  1. 空间复杂度:O(1)
  2. 时间复杂度
    1. 最好O(n)——有序
    2. 最差O(n^2)——逆序
    3. 平均O(n^2)
  3. 稳定性:稳定
  4. 适用性:顺序表、链表都可以

👩‍💻 快速排序

void QuickSort(int A[],int low,int high){
	if(low < high){  //递归跳出的条件
		int pivotpos = Partition(A,low,high);//划分
		QuickSort(A,low,pivotpos-1);  //划分左子表
		QuickSort(A,pivotpos+1,high);  //划分右子表
	}
}
//用第一个元素将待排序序列划分成左右两个部分
int Partition(int A[],int low,int high){
	int pivot = A[low];  //第一个元素作为枢轴
	while(low < high){  //用low,high搜素枢轴的最终位置
		while(low < high && A[high] >= pivot) --high;
		A[low] = A[high];  //比枢轴小的元素移动到左端
		while(low < high && A[low] <= pivot) ++low;
		A[high] = A[low];  //比枢轴大的元素移动到右端
	}
	A[low] = pivot; //枢轴元素存放到最终位置
	return low;  //返回存放枢轴的最终位置
}
  1. 算法思想:在待排序表L[1…n]中任取一个元素pivot作为枢轴(或基准,通常取首元素),通过一趟排序将待排序表划分为独立的两部分L[1…k-1]和L[k+1…n],使得L[1…k-1]中的所有元素小于pivot,L[k+1…n]中的所有元素大于等于pivot,则pivot放在了其最终位置L(k)上,这个过程称为一次“划分”。然后分别递归地对两个子表重复上述过程,直至每部分内只有一个元素或空为止,即所有元素放在了其最终位置上。
  2. 算法表现主要取决于递归深度,若每次“划分”越均匀,则递归深度越。“划分”越不均匀,则递归深度越深。
  3. 性能:
    1. 空间复杂度
      1. 最好:O(log2n)
      2. 最坏:O(n)
    2. 时间复杂度
      1. 最好:O(nlog2n)——每次划分很平均
      2. 最坏:O(n^2)——原本正序或逆序
      3. 平均:O(nlog2n)
    3. 稳定性:不稳定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Annabelle.02

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值