首页 > 编程语言 > 详细

希尔 快速 堆排序 归并排序 照抄

时间:2019-09-17 22:40:27      阅读:102      评论:0      收藏:0      [点我收藏+]

C++实现(照抄)一些

插入排序之希尔排序

技术分享图片
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
const int si = 500;
int arr[si];
int n;
void shellsort(int a[], int n) {
    for (int dk = n / 2; dk >= 1; dk >>= 1) {
        int te = 0;
        for (int i = dk + 1; i <= n; i++) {//i是gap 与前面的i - dk比较
            if (a[i] < a[i - dk]) {//a[i - dk] 应该比a[i]小 才是增序 不满足条件 把前面的都换位置 挪腾
                te = a[i];//暂存i
                int j;
                for (j = i - dk; j > 0 && te < a[j]; j -= dk) {
                    //te < a[j]找到合适的位置 j小于i a[j]应该比a[i]小 才是增序 不满足条件
                    a[j + dk] = a[j];//挪腾
                }
                a[j + dk] = te;
            }
        }
    }
}
int main(){
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> arr[i];
    }
    shellsort(arr, n);
    //测试序列
    //10 1 9 2 8 4 7 6 0 3 5
    //20 5 1 2 34 70 1 40 4 13 4 1 9 2 8 4 7 6 0 3 5
    for (int i = 1; i <= n; i++) {
        cout << arr[i] << " ";
    }
    return 0;
}
View Code

 

快速排序

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
const int si = 500;
int arr[si];
int n;

int partition(int a[], int l, int r) {
    int pivot = a[l];//这一个作为中心 也是暂存temp
    while (l < r) {
        while (l < r && a[r] >= pivot) r--;//退出循环时 a[r]比pivot小 应该在pivot左边 而在右边 把它倒腾到左边的位置 a[l] = a[r]; l这个位置刚刚好没人用
        a[l] = a[r];//把a[r]放在左边
        while (l < r && a[l] <= pivot) l++;//退出循环时 a[l]比pivot大 应该在pivot右边 而在左边 把它倒腾到右边的位置 a[r] = a[l]; r这个位置刚刚好没人用
        a[r] = a[l];//把a[l]放在右边
    }//两个子while循环多次之后 就能得到 左边都比pivot小 右边都比pivot大的序列
    
    a[l] = pivot;//还给他
    return l;//l就是pivot的位置
}
void Qsort(int a[], int l, int r) {
    if (l < r) {
        int pivot = partition(a, l, r);
        //pivot 中心 不用动
        Qsort(a, l, pivot - 1);
        Qsort(a, pivot + 1, r);
    }
}
int main(){
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> arr[i];
    }
    Qsort(arr, 0, n);
    //测试序列
    //10 1 9 2 8 4 7 6 0 3 5
    //20 5 1 2 34 70 1 40 4 13 4 1 9 2 8 4 7 6 0 3 5
    for (int i = 1; i <= n; i++) {
        cout << arr[i] << " ";
    }
    return 0;
}

 

堆排序 大根堆 结合P311自己画的例子看

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
const int si = 500;
int arr[si];
int n;

void AdjustDown(int h[], int k, int len) {//将第k个元素 向下进行调整
    int te = h[k];
    for (int i = 2 * k; i <= len; i *= 2) {
        if (i < len && h[i] < h[i + 1]) i++;//左孩子和右孩子比较 取比较大的孩子的index
        if (te >= h[i]) break;//te比他大 那h[k]不用动 就是(子)大根堆
        else {
            h[k] = h[i];//h[k]也就是te 比他小 要交换 变成(子)大根堆
            k = i;//父亲已经调整好了 是大根堆 向下调整子树 让他们变成大根堆
        }
    }
    h[k] = te;
}
void buildMaxHeap(int h[]) {
    for (int i = n / 2; i > 0; i--)//从i = n/2 到 i= 0 反复调整堆
        AdjustDown(h, i, n);
}
void hsort(int h[]) {
    buildMaxHeap(h);//初始建堆
    for (int i = n; i > 1; i--) {
        cout << h[1] << " ";//大根堆 第一个就是最大的
        swap(h[i], h[1]);
        AdjustDown(h, 1, i - 1);
    }
}
int main(){
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> arr[i];
    }
    hsort(arr);
    //测试序列
    //10 1 9 2 8 4 7 6 0 3 5
    //20 5 1 2 34 70 1 40 4 13 4 1 9 2 8 4 7 6 0 3 5
    for (int i = 1; i <= n; i++) {
    //    cout << arr[i] << " ";
    }
    return 0;
}

 

归并排序 稳定

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
const int si = 500;
int arr[si];
int temp[si + 1];
int n;

void Merge(int a[], int low, int m, int h) {
    int i, j, k;
    for (i = low; i <= h; i++)
        temp[i] = a[i];//将所有目标元素复制到辅助数组
    for (i = k = low, j = m + 1; i <= m && j <= h; k++) {
        if (temp[i] <= temp[j])
            a[k] = temp[i++];//将小的复制到a中
        else
            a[k] = temp[j++];
    }
    while (i <= m) a[k++] = temp[i++];
    while (j <= h) a[k++] = temp[j++];
    //这两个while只会执行一个
}
void MergeSort(int a[], int l, int h) {
    if (l < h) {//low high
        int mid = l + h >> 1;
        MergeSort(a, l, mid);
        MergeSort(a, mid + 1, h);
        Merge(a, l, mid, h);
    }
}
int main(){
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> arr[i];
    }
    MergeSort(arr, 1, n);
    //测试序列
    //10 1 9 2 8 4 7 6 0 3 5
    //20 5 1 2 34 70 1 40 4 13 4 1 9 2 8 4 7 6 0 3 5
    for (int i = 1; i <= n; i++) {
        cout << arr[i] << " ";
    }
    return 0;
}

 

希尔 快速 堆排序 归并排序 照抄

原文:https://www.cnblogs.com/smatrchen/p/11535948.html

(1)
(1)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!