网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

堆排序快速排序插入排序-创新互联

堆排序

数据结构使用的是1 dimension的数组来作为二叉树的堆结构,所以并没有使用结构体,而是直接使用了数组

公司专注于为企业提供成都网站设计、网站建设、外贸网站建设、微信公众号开发、电子商务商城网站建设,微信小程序定制开发,软件按需搭建网站等一站式互联网企业服务。凭借多年丰富的经验,我们会仔细了解各客户的需求而做出多方面的分析、设计、整合,为客户设计出具风格及创意性的商业解决方案,成都创新互联更提供一系列网站制作和网站推广的服务。

而且堆是完全二叉树,也就是除了最后一层以外,其他层都是满二叉树,最后一层可能不满,所以1dimension数组产生二叉树就很方便,第一个数字就是根节点,然后是左右子节点,层序遍历即可

性质:完全二叉树的孩子节点是父节点的2xn或者2x n+1

第一步:产生堆,要满足性质,每个父节点的值比孩子节点都要大(小),递推的话根节点就是大(小)值

这里要注意,孩子节点是父节点的2xn或者2x n+1,所以从len/2-1的位置开始调整即可也即是最后一个父节点

for(int i = len/2 - 1; i >= 0; i--)   //create heap struct
        max_heapify(i, len - 1);

第二步:分区,两个区,堆区和已经排好序的区,堆区是无序的,每次将堆的根节点也就是大值移到末尾,然后再次产生堆,由于堆已经是大小一致,只要将根节点移到合适的位置即可

输入:8 9 10 1 3 6 5 4 2 7 0

图来自 https://www.runoob.com/w3cnote/heap-sort.html

1.7 堆排序 | 菜鸟教程 (runoob.com)​www.runoob.com/w3cnote/heap-sort.html

#include#include#include

using namespace std;
vectors6;

void printvec(vectora){
    for(int i=0; i s6[son]) {
            return;
        }
        else {
            swap(s6[son], s6[dad]);
            dad = son;
            son = dad * 2 + 1;
        }
    }
    return;
}

int main(void){
    int n, num;
    cin>>n;
    for(int i=0; i>num;
        s6.push_back(num);
    }
    int len = s6.size();
    for(int i = len/2 - 1; i >= 0; i--)   //create heap struct
        max_heapify(i, len - 1);
    for(int i = len - 1; i >0; i--) { //move the largest to end and recreate heap struct
        swap(s6[0], s6[i]);
        max_heapify(0, i - 1);
    }
    printvec(s6);
    return 0;
}

1.7 堆排序 | 菜鸟教程 (runoob.com) 

#includeusing namespace std;
int arr[] = {2, 9, 6, 1, 5, 8, 7, 11, 100, 30, 31, 38, 60, 50, 30};
void printvec(int len) {
    printf("%d", arr[0]);
    for(int i = 1; i< len; i++) printf(" %d", arr[i]);
}
void maxheapify(int start, int end) {
    int dad = start;
    int son = dad * 2 + 1;
    while(son< end) {           //是while不是if
        if(son+1< end && arr[son+1] >arr[son]) //子节点的大值
            son++;
        if(arr[dad] >arr[son]) return;   //父节点是大值返回
        if(arr[dad]< arr[son]) {
            swap(arr[dad], arr[son]);
            dad = son;
            son = dad * 2 + 1;
        }
    }
}
void heapsort(int len) {
    for(int i = len/2 - 1; i >= 0; i--) //len/2-1拿到最后一个父节点的序号,从0开始
        maxheapify(i, len);   //从下到上, generate heap
    for(int i = len - 1; i >0; i--) {   
        swap(arr[0], arr[i]);
        maxheapify(0, i-1); //从上到下
    }
}
int main(int argc, char **argv) {
    int len = sizeof(arr)/sizeof(*arr);
    if(len==1) {
        printvec(len);
        return EXIT_SUCCESS;
    }
    heapsort(len);
    printvec(len);
    return EXIT_SUCCESS;
}

快速排序

选定(枢轴)支点pivot,然后配置左右的定位符i,j

支点可以任意选取,支点所在值记为A,左右定位符一般是0, len - 1

  1. 从右向左扫描,若是值小于A,则将该值放到支点,然后此处产生空洞L
  2. 从左向右扫描,若是值大于A,则将该值放到空洞L所在位置,此处产生空洞,用A来填补即可
  3. 分片,以支点所在位置分片,左右分别进行1、2,不断递归直到只剩一个值
#include#include#include

using namespace std;
vectorv6;

void printvec(vectora){
    for(int i=0; i= A)
                j--;
            if(i< j) {
                v6[start] = v6[j];
                i++;
            }
            while(i< j && v6[i]< A)
                i++;
            if(i< j) {
                v6[j] = v6[i];
                v6[i] = A;
                j--;
            }
        }
        v6[i] = A;//填补最后的空洞
        quick_sort(start, i - 1);
        quick_sort(i + 1, end);
    }
    return;
}

int main(void){
    int n, num;
    cin>>n;
    for(int i=0; i>num;
        v6.push_back(num);
    }
    int len = v6.size();
    quick_sort(0, len - 1);
    printvec(v6);
    return 0;
}

快速排序 | 菜鸟教程 (runoob.com)

#includeusing namespace std;
int arr[] = {2, 9, 6, 1, 5, 8, 7, 11, 100, 30, 31, 38, 60, 50, 30};
void printvec(int len) {
    printf("%d", arr[0]);
    for(int i = 1; i< len; i++) 
        printf(" %d", arr[i]);
}
void quicksort(int l, int r) {
    if(l>=r) return;
    int h = arr[l];
    int start = l;
    int end = r;
    while(l< r) {
        while(l< r && arr[r] >= h)
            r--;
        if(l

插入排序

1 2 3 9 6 8 7

1 2 3 9是已经排好序的序列, 然后后一个是6,将6插入到已经排好序的1 2 3 9, 应该要放到3和9之间, 所以插入到3和9之间,也就是1 2 3 6 9,所以叫做插入排序的呢

得到1 2 3 6 9 8 7

接着就是要就是要处理其他的剩下的

C++
#include#include#include

using namespace std;

void printvec(vectora){
    for(int i=0; i s0;
    int n, num;
    cin>>n;
    for(int i=0; i>num;
        s0.push_back(num);
    }
    for(int i=0; i=s0[i+1]){
                    s0.insert(s0.begin()+j, s0[i+1]);
                    s0.erase(s0.begin()+i+2);
                }
            }
        }
    }
    printvec(s0);
    return 0;
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


文章标题:堆排序快速排序插入排序-创新互联
网站路径:http://bjjierui.cn/article/ijpge.html