目录
排序分类
内部排序 | 将排序数一次性装入内存 |
外部排序 | 相反,速度慢 |
外部排序用于排序文件很大,无法将整个文件装入内存,只能将文件装入外存上。
外部排序方法:数据内外存交换和数据归并
- 将待归并记录分成若干长度t的段R1,R2……
- 利用上述内部排序方法,对每一段进行内部排序,讲过排序的段称为“顺串”,“顺串”生成后即写入内存。
- 将“顺串”归并。
简而言之,就是归并……
STL排序
排序算法要求给出随机访问迭代器,适用于一般数组和STL容器中的vector,string,deque
常用分类:
函数名 | 功能描述 |
sort | 对给定区间所有元素排序 |
stable_sort | 对给定区间所有元素进行稳定排序 |
partial_sort | 对给定区间所有进行部分排序 |
partial_sort_copy | 对给定区间复制并排序 |
nth_element | 找出给定区间的某个位置对应元素 |
is_sorted | 判断一个区间是否已经排好序 |
partition | 是的某个符合条件的元素放到前面 |
stable_partition | 相对稳定的使得符合某个条件的元素放到前面 |
STL比较函数
排序的基础是比较,比较函数放在头文件<functional>中。比较函数通过括号运算符重载给出,即他们都是泛函。
比较函数的返回值均为bool,binary_function模板派生而来。
常用列表:
名称 | 功能描述 |
equal_to | 相等 |
not_equal_to | 不相等 |
less | 小于 |
greater | 大于 |
less_equal | 小于等于 |
greater_equal | 大于等于 |
std::sort()底层原理
简单的说就是:快速排序分段递归,当数据量小的时候是插入排序,当数据量大的时候,是堆排序;堆排序能改善递归层数过深的问题。
详见:http://feihu.me/blog/2014/sgi-std-sort/
归并排序
#include <iostream>
using namespace std;
const int SENTINEL = (1<<21);
const int MAX = 5000;
int L[MAX/2],R[MAX/2];
int cnt;
//负责分割
void merge(int A[],int n,int left,int mid,int right){
int n1 = mid - left;//前半部分长度
int n2 = right - mid;//后半部分长度
for(int i = 0;i<n1;i++)
L[i] = A[left+i];
for(int i=0;i<n2;i++)
R[i] = A[mid+i];
L[n1] = R[n2] = SENTINEL;//设置哨兵,最后一个元素为无穷大
int i = 0,j = 0;
for(int k = left;k<right;k++){
cnt++;
if(L[i]<=R[j]){
A[k] = L[i++];
}else{
A[k] = R[j++];
}
}
}
//负责整合
void mergeSort(int A[],int n,int left,int right){
if(left+1<right){
int mid = (left+right)/2;
mergeSort(A,n,left,mid);
mergeSort(A,n,mid,right);
merge(A,n,left,mid,right);
}
}
int main(){
int A[MAX],n;
cnt = 0;
cin>>n;
for(int i=0;i<n;i++)
cin>>A[i];
mergeSort(A,n,0,n);
for(int i=0;i<n;i++)
cout<<A[i]<<" ";
cout<<endl;
return 0;
}