排序算法

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <time.h>
using namespace std;
//插入排序
void Insert_Sort(int arr[10],int len)
{
    srand((unsigned)time(NULL));
    int j;
    int tmp = 0;
    for(int i = 1;i < len;i ++)
    {
        tmp = arr[i];
        j = i-1;
        while(j >=0 && arr[j] > tmp)
        {
            arr[j+1] = arr[j];
            j--;
        }
        arr[j+1] = tmp;
    }
}
//希尔排序
void Shell_Sort(int arr[],int len,int div)
{
    int j,tmp;
    for(int i = div;i < len;i += div)
    {
        tmp = arr[i];
        j = i - div;
        while(j >=0 && arr[j] > tmp)
        {
            arr[j+div] = arr[j];
            j -= div;
        }
        arr[j + div] = tmp;
        if(i >= len-div)
        {
            div --;
            i = 0;
        }
        if(div == 0)
            break;
    }
}
void Select_Sort(int arr[10],int len)
{
    int tmp;
    for(int i = 0; i < len;i ++)
    {
        for(int j=i+1;j<len;j++)
        {
            if(arr[i]>arr[j])
            {
                tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
        }
    }
}
//堆排序
//建堆
void HeapAdjust(int *a,int i,int size)  //调整堆
{
    int lchild=2*i;       //i的左孩子节点序号
    int rchild=2*i+1;     //i的右孩子节点序号
    int max=i;            //临时变量
    if(i<=size/2)          //如果i是叶节点就不用进行调整
    {
        if(lchild<=size&&a[lchild]>a[max])
        {
            max=lchild;
        }
        if(rchild<=size&&a[rchild]>a[max])
        {
            max=rchild;
        }
        if(max!=i)
        {
            swap(a[i],a[max]);
            HeapAdjust(a,max,size);    //避免调整之后以max为父节点的子树不是堆
        }
    }
}

void BuildHeap(int *a,int size)    //建立堆
{
    int i;
    for(i=size/2;i>=1;i--)    //非叶节点最大序号值为size/2
    {
        HeapAdjust(a,i,size);
    }
}

void Heap_Sort(int arr[],int len)
{
    int i;
    BuildHeap(arr,len);
    for(i=len;i>=1;i--)
    {
        //cout<<a[1]<<" ";
        swap(arr[1],arr[i]);       //交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面
        //BuildHeap(a,i-1);        //将余下元素重新建立为大顶堆
        HeapAdjust(arr,1,i-1);     //重新调整堆顶节点成为大顶堆
    }
}
void Bubble_Sort(int arr[],int len)
{
    for(int i = 0;i < len;i ++)
    {
        for(int j = 0;j < len-i;j ++)
        {
            if(arr[j]>arr[j+1])swap(arr[j],arr[j+1]);
        }
    }
}
//快速排序
void Quick_Sort(int arr[],int left,int right)
{
    if(left<right)
    {
        int i = left;
        int j = right;
        int x=arr[left];
        while(i<j)
        {
            while(i < j && arr[j] > x)
                j--;
            arr[i]=arr[j];
            while(i < j && arr[i] < x)
                i++;
            arr[j]=arr[i];
        }
        arr[i] = x;
        Quick_Sort(arr,left,i-1);
        Quick_Sort(arr,i+1,right);
    }
}
//归并排序
void mergeSort(int a[], int l, int r) { //  8, 5, 4, 9, 2, 3, 6
    if(l >= r) return;   // exit.
    int mid = (l+r) / 2; // overflow  <->  l + (r-l)/2
    mergeSort(a, l, mid);
    mergeSort(a, mid+1, r);
    int *arr = new int[r-l+1];
    int k = 0;
    int i = l, j = mid + 1;
    while(i <= mid && j <= r) {
        if(a[i] <= a[j]) {
            arr[k++] = a[i++];
        }
        else {
            arr[k++] = a[j++]; // ans += (mid-i+1);
        }
    }
    while(i <= mid) arr[k++] = a[i++];
    while(j <= r) arr[k++] = a[j++];
    for(int i = l; i <= r; i++) {
        a[i] = arr[i-l];
    }
    delete []arr;
}
int main()
{
    int arr[10];
    //随机生成小于10的数组
    for(int i = 0;i < 10;i ++)
        arr[i] = rand()%10;

    for(int i = 0;i < 10;i ++)
        printf("%d\t",arr[i]);
    //插入排序
    //Insert_Sort(arr,10);
    //for(int i = 0;i < 10;i ++)
        //printf("%d\t",arr[i]);
    //shell 排序
    //Shell_Sort(arr,10,3);
    //选择排序
    //Select_Sort(arr,10);
    //冒泡排序
    //Bubble_Sort(arr,10);
    //堆排序
    //Heap_Sort(arr,10);
    //快速排序
    //Quick_Sort(arr,0,9);
    //归并排序
    mergeSort(arr,0,9);
    //排完序输出
    for(int i = 0;i < 10;i ++)
        printf("%d\t",arr[i]);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值