目录
前言
在数据结构中,排序是指将一组数据按照特定的规则重新排序的过程。排序可以使数据按照升序或者降序排列,从而方便后续的操作和查找。
一、排序的概念及运用
1.排序的概念
排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
例如:
内部排序:数据元素全部放在内存中的排序。
外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。
2.排序的运用
排序在生活中的使用无处不在,成绩排名、商品排名、电影榜单等等数不胜数。
3.常见排序算法
二、插入排序与选择排序
2.1插入排序
2.1.1直接插入排序
1)基本思想
直接插入排序是一种简单的排序算法,它的基本思想是将待排序的数据分成已排序和未排序两部分,每次从未排序部分中取出一个元素,然后将其有序地插入到已排序部分的合适位置。
当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移
动画演示:
2)具体步骤
-
将第一个元素视为已排序部分,将剩余的元素视为未排序部分。
-
从未排序部分取出第一个元素,将其插入到已排序部分的合适位置。插入时,从后往前逐个比较已排序部分的元素,将大于待插入元素的元素依次后移,直到找到一个小于或等于待插入元素的位置。
-
重复步骤2,直到未排序部分中的所有元素都插入到已排序部分。
3)算法特性
-
元素集合越接近有序,直接插入排序算法的时间效率越高
-
时间复杂度:直接插入排序的时间复杂度是O(n^2),其中n是待排序数据的个数。当输入数据已经基本有序时,直接插入排序的性能较好,时间复杂度可以降低到O(n)。但当输入数据完全逆序时,直接插入排序的性能较差,时间复杂度会达到最大值O(n^2)。
-
空间复杂度:O(1),它是一种稳定的排序算法
-
稳定性:稳定
4)算法实现
void InsertSort(int* a, int n)
{
for (int i = 0; i < n; i++)
{
int end = i-1;
int tmp = a[i];
//将tmp插入到[0, end]区间中,保持有序
while (end >