根据排序时数据所占用存储器的不同,可将排序分为两类,一类是整个排序过程完全在内存中进行,成为内部排序。另一类是由于待排序记录数据太大,内存无法容纳全部数据,需要借助外部存储才能完成,称为外部排序。
按照方法可以分为交换类排序和插入类排序。
先看下交换类排序,它的思想是通过一系列交换逆序元素进行排序的方法。
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,然后对于左右形成的两个子表采用同样的方法进一步划分。