ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码

八大排序算法(5/6)

来源:网络整理     时间:2016-06-29     关键词:

本篇文章主要介绍了" 八大排序算法",主要涉及到方面的内容,对于其他编程jrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播感兴趣的同学可以参考一下: 八大排序算法标签:算法 查找和排序1. 插入排序—直接插入排序 ( 稳定的 O(nlogn) )基本思想: 将一个记录插入到已排序好的有序表中,从而得到一个...

//  从i节点开始调整,n为节点总数 从0开始计算 i节点的子节点为 2*i+1, 2*i+2  void MinHeapFixdown(vector<int> &a, int i, int n)  
{  
    int j, temp;  
    temp = a[i];  
    j = 2 * i + 1;  
    while (j < n)  
    {  
        if (j + 1 < n && a[j + 1] < a[j]) //在左右孩子中找最小的  
            j++;  

        if (a[j] >= temp)  
            break;  

        a[i] = a[j];     //把较小的子结点往上移动,替换它的父结点  
        i = j;  
        j = 2 * i + 1;  
    }  
    a[i] = temp;  
}  
//在最小堆中删除数  void MinHeapDeleteNumber(vector<int> &a,int n)  
{  
    Swap(a[0], a[n - 1]);  
    MinHeapFixdown(a, 0, n - 1);  
}  

建立小顶堆

void MakeMinHeap(vector<int> &a, int n)  
{  
    for (int i = n / 2 - 1; i >= 0; i--)  
        MinHeapFixdown(a, i, n);  
} 

堆排序

// 小顶堆排序后的数组是递减的,若要递增,使用大顶堆void Minheapsort(vector<int> &a, int n)  
{   
    MakeMinHeap(a, n); 
    for (int i = n - 1; i >= 1; i--)  
    {  
        Swap(a[i], a[0]);  
        MinHeapFixdown(a, 0, i);  
    }  
}  

完整的堆排序

// 4. 堆排序void MaxHeapFixdown(vector<int> &a, int i, int n)  
{  
    int j = 2 * i + 1, temp = a[i];  
    while (j < n)  
    {  
        if (j + 1 < n && a[j + 1] > a[j]) //在左右孩子中找最大的  
            j++;  

        if (a[j] <= temp)  
            break;  

        a[i] = a[j];     //把较大的子结点往上移动,替换它的父结点  
        i = j;  
        j = 2 * i + 1;  
    }  
    a[i] = temp;  
}  
void MakeMaxHeap(vector<int> &a, int n)  
{  
    for (int i = (n-1)/2; i >= 0; i--)  
        MaxHeapFixdown(a, i, n);  
}  
void Maxheapsort(vector<int> &a, int n)  
{  
    MakeMaxHeap(a, n);  
    for (int i = n - 1; i > 0; i--)  
    {  
        swap(a[i], a[0]);  
        MaxHeapFixdown(a, 0, i);  
    }  
} 

5. 交换排序—冒泡排序(Bubble Sort) ( 稳定的 O(n2) )

基本思想:

在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

算法实现:

void BubbleSort(vector<int> &a) {
    int n = a.size();
    for(int i = 0;ifor(int j=0;j<>1;++j){
        if(a[j] > a[j+1])
            swap(a[j],a[j+1]);
    }
}  

6. 交换排序—快速排序(Quick Sort) ( 不稳定的 O(nlogn) )

基本思想:

1)选择一个基准元素,通常选择第一个元素或者最后一个元素,
2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大。
3)此时基准元素在其排好序后的正确位置
4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。

快速排序的示例:

相关图片

相关文章