几种常见的排序

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:对顺串文件的每一趟扫描都会产生更大的顺串,直到最后剩下一个顺串。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值