1:插入排序
for(int i = 1;i < n;i++){
for(int j = i; (j > 0) && array[j] > array[j - 1];j --){
swap(array,j,j-1);
}
}
2:冒泡排序
for(int i = 0; i < n -1;i++){
for(int j = n -1; j > i;j--){
if(array[j] > array[j-1]){
swap(array,j,j-1);
}
}
}
3:选择排序
for(int i = 0; i < n -1;i++){
int lowindex = i;
for(int j = i + 1;j < n; j++){
if(array[j] > array[lowindex]){
lowindex = j;
}
}
swap(array,i,lowindex);
}
4:快速排序
void swap(int A[],int i,int j){
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
int partition(int A[],int l,int r,int pivot){
do{
while(A[++l] < pivot);
while((r > l) && A[--r] > pivot);
swap(A,l,r);
}while(l < r);
return l;
}
void quickSort(int A[],int i,int j){
if(j <= i){
return;
}
//find pivot element
int pivotIndex = (i+j)/2;
//需要把中轴值换到最后,partition执行之后再换回中轴值,
//这样可以保证我们是按中轴值将被排序数组划分成两个部分
swap(A,pivotIndex,j);
int k = partition(A,i-1,j,A[j]);
swap(A,k,j);
quickSort(A,i,k-1);
quickSort(A,k+1,j);
}
5:堆排序
堆排序的主要是建堆,然后依次移除顶层元素。
这是整形最大堆的实现http://blog.csdn.net/qq_27856623/article/details/70752058
void heapsort(int A[],int n){
heap<int,Comp> H(A,n,n);
for(int i = 0; i < n;i ++){
H.removefirst();
}
}
6:分配排序
分配排序的基本思想
for(int i = 0; i < n; i++){
B[A[i]] = A[i];
}
它的缺点是只能对一个从0到n-1的序列进行排序。
二:外排序(磁盘排序)
1:算法流程
a:把原始文件划分成两个大小相等的顺串文件
b:从每个顺串文件中抽取出一个块,读入输入缓冲区中
c:从每个输入缓冲区中取出第一条记录,把它们按照安排好的次序写入一个顺序输出缓冲区中。
d:从每个输入缓冲区中取出第二条记录,把它们按照安排好的次序写入另一个顺串输出缓冲区中。
e:在两个顺串输出缓冲区之间交替输出,重复这些步骤直至结束。当遇到一个输入块的末尾时,从相应的输入文件中读入第二个块。当一个顺串输出缓冲区已满时,把它写回到 相应的输出文件。
f:使用原始输出文件作为输入文档,重复b-e步骤。在第二趟扫描中。每个输入顺串文件的前两条记录应经排好次序。这样就可以把这两个顺串归并成一个长度为4的顺串输出了。
g:对顺串文件的每一趟扫描都会产生更大的顺串,直到最后剩下一个顺串。