各种排序

各种排序
堆排序在最后…

#include <bits/stdc++.h>

using namespace std;

int a[105];

void quick_sort(int l, int r)
{
    if(l>=r)
        return ;
    int i = l;
    int j = r;
    int tmp = a[l];
    while(i<j)
    {
        while(a[j]>tmp&&i<j)
            j--;
        while(a[i]<=tmp&&i<j)
            i++;
        if(i<j)
            swap(a[i],a[j]);
    }
    swap(a[i],a[l]);
    quick_sort(l,i-1);
    quick_sort(i+1,r);
}

void bubble_sort(int n)
{
    int flag = n;
    while(flag)
    {
        int k = flag;
        flag = 0;
        for(int i=1; i<k; i++)
        {
            if(a[i-1]>a[i])
            {
                swap(a[i-1],a[i]);
                flag = i;
            }
        }
    }
    return ;
}

void insert_sort(int n)
{
    for(int i=1; i<n; i++)
    {
        int tmp = a[i];
        for(int j=i-1; j>=0&&a[j]>tmp; j--)
        {
            swap(a[j+1],a[j]);
        }
    }
    return ;
}

void shell_sort(int n)
{
    for(int gap=n/2; gap>0; gap/=2)
    {
        for(int i=gap; i<n; i++)
        {
            for(int j=i-gap; j>=0&&a[j]>a[j+gap]; j-=gap)
            {
                swap(a[j],a[j+gap]);
            }
        }
    }
    return ;
}

void select_sort(int n)
{
    for(int i=0; i<n; i++)
    {
        int pos = i;
        for(int j=i+1; j<n; j++)
        {
            if(a[j]<a[pos])
                pos = j;
        }
        swap(a[i],a[pos]);
    }
}

void merge_list(int l, int r, int l2, int r2, int tmp[])
{
    int i = l;
    int j = l2;
    int k = 0;
    while(i<=r&&j<=r2)
    {
        if(a[i]<a[j])
        {
            tmp[k++] = a[i];
            i++;
        }
        else
        {
            tmp[k++] = a[j];
            j++;
        }
    }
    while(i<=r)
        tmp[k++] = a[i++];
    while(j<=r2)
        tmp[k++] = a[j++];
    for(int i=0; i<k; i++)
    {
        a[l+i] = tmp[i];
    }
}

void merge_sort(int l, int r, int  tmp[])
{
    if(l<r)
    {
        int mid = (l+r)>>1;
        merge_sort(l,mid,tmp);
        merge_sort(mid+1,r,tmp);
        merge_list(l,mid,mid+1,r,tmp);
    }
}

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        for(int i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
        }
//        quick_sort(0,n-1);
//        bouten_sort(n);
//        insert_sort(n);
//        shell_sort(n);
//        select_sort(n);
        int* tmp = new int[n];
        merge_sort(0,n-1,tmp);
        delete[] tmp;
        for(int i=0; i<n; i++)
            printf("%d\n",a[i]);
    }
}

#include <bits/stdc++.h>

using namespace std;

int a[105];
int b[105];

/**

整理思路(以最小堆为例)
堆是二叉树的一种,可以用数组实现
要实现的操作:建堆,删除堆顶,堆排序
建堆:每次利用插入操作向现有堆中插入一个元素,然后通过堆的自底向上调整维护最小堆
删除堆顶:删除堆顶后为保持最小堆特性,利用堆的自顶向下调整
堆排序:堆排序就可以利用不停的取出堆顶即可

*/

///堆的自底向上调整,类似插入排序,将一个数据插入到有序数据中
///悄悄地说...插入排序我也写了博客...可以一看

void fix_up(int id)
{
    for(int j=(id-1)>>1; j>=0&&a[j]>a[id]; id=j,j=(id-1)>>1)
    {
        swap(a[id],a[j]);
    }
}

///插入操作,即向数组末尾添加数据,然后进行调整

void insert_val(int id, int val)
{
    printf("%d  %d\n",id,val);
    a[id] = val;
    fix_up(id);
}

/**

堆的自顶向下调整

从根结点开始进行一次从上向下的调整。
调整时先在左右儿子结点中找最小的,
如果父结点比这个最小的子结点还小说明不需要调整了,
反之将父结点和它交换后再考虑后面的结点。
相当于从根结点将一个数据的“下沉”过程。

*/
void fix_down(int i, int n)
{
    int j,tmp;
    tmp = a[i];
    j = 2 * i + 1;
    while(j<n)
    {
        if(j+1<n&&a[j+1]<a[j])
            j++;
        if(a[j]>tmp)
            break;
        a[i] = a[j];
        i = j;
        j = 2 * i + 1;
    }
    a[i] = tmp;
}

/**
删除0号节点,我们可以这样操作,
将最后一个数据的值赋给根结点,
然后进行一次自顶向下的调整
*/

void delete_node(int id, int n)
{
    swap(a[0],a[n-1]);
    fix_down(0,n-1);
}

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int id = 0;
        int minn = 0x3f3f3f3f;
        for(int i=0; i<n; i++)
        {
            scanf("%d",&b[i]);
            if(b[i]<minn)
            {
                minn = b[i];
                id = i;
            }
        }
        //建堆
        a[0] = minn;
        int j = 1;
        for(int i=0; i<n; i++)
        {
            if(i!=id)
                insert_val(j++,b[i]);
        }
        for(int i=0; i<n; i++)
            printf("%d\n",a[i]);
        for (int i = n - 1; i >= 1; i--)
        {
            swap(a[i], a[0]);
            fix_down(0, i);
        }
        for(int i=0; i<n; i++)
            printf("%d...\n",a[i]);
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值