排序大综合

排序大综合

//排序 大综合 测试 我记住了没!!
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;

void BubbleSort(int a[], int n)
{
    if(NULL == a || n == 0)
    {
        return ;
    }

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

void InsertSort(int a[], int n)
{
    if(NULL == a || n == 0)
    {
        return ;
    }

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

void Merge(int a[], int l, int mid, int r)
{
    int leftsize = mid - l + 1;
    int rightsize = r - mid;

    int *left = new int[leftsize];  
    int *right = new int[rightsize];

    for(int i = 0; i < leftsize; i++)
    {
        left[i] = a[l + i];
    }
    for(int i = 0; i < rightsize; i++)
    {
        right[i] = a[mid + i + 1];
    }

    int i = 0, j = 0, k = l;
    while(i < leftsize && j < rightsize)
    {
        if(left[i] < right[j])
        {
            a[k++] = left[i++];
        }
        if(left[i] > right[j])
        {
            a[k++] = right[j++];
        }
    }

    while(i < leftsize)
    {
        a[k++] = left[i++];
    }
    while(j < rightsize)
    {
        a[k++] = right[j++];
    }

    free(left);
    free(right);
}

void MergeSort(int a[], int l, int r)
{
    if(l < r)
    {
        int mid = (l + r)/2;
        MergeSort(a, l, mid) ;
        MergeSort(a, mid + 1, r);
        Merge(a, l, mid, r); 
    }
}

void QuickSort(int a[], int left, int right)
{
    if(left < right)
    {
        int i = left, j = right, key = a[left];
        while(i < j && a[j] > key)
        {
            j--;
        }
        if(i < j)
        {
            a[i++] = a[j];
        }

        while(i < j && a[i] < key)
        {
            i++;
        }
        if(i < j)
        {
            a[j--] = a[i];
        }

        a[i] = key;
        QuickSort(a, left, i);
        QuickSort(a, i + 1, j);
    }
} 

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

void ShellSort(int a[], int n)
{
    int d = n;

    while(d)
    {
        d = d/2;
        for(int i = 0; i < n - d; i++)
        {
            if(a[i] > a[i + d])
            {
                swap(a[i], a[i+d]);
            }
        }   
    }
}


void  AdjustHeap(int a[], int start, int end)
{
    int value = a[start];

    for(int i = 2*start + 1; i <= end; i *= 2)
    {
        if(i < end && a[i] > a[i + 1])
        {
            i++;
        }

        if(value > a[i])
        {
            a[start] = a[i];
            start = i;
        }
        else
        {
            break;
        }

    }
    a[start] = value;
}

void HeapSort(int a[], int n)
{
    //建一个大顶堆 
    for(int i = n/2 -1; i >= 0; i--)
    {
        AdjustHeap(a, i, n);
    }   
    //堆排序 
    for(int i = n - 1; i > 0; i--)
    {
        swap(a[0], a[i]);
        AdjustHeap(a, 0, i - 1);
    }
}

int main()
{
    int *arr = new int;
    int n = 0;

    cin >> n;
    for(int i = 0; i < n; i++)
    {           
        cin >> arr[i];
    }

    //BubbleSort(arr, n);
    //InsertSort(arr, n);
    //MergeSort(arr, 0, n-1);
    //QuickSort(arr, 0, n - 1);
    //ChooseSort(arr, n);
    //ShellSort(arr, n);
    //BinaryInsertSort

    HeapSort(arr, n);
    for(int i = 0; i < n; i++)
    {
        cout << arr[i] << " ";
    }


    system("pause");
    return 0;   
}

这里写图片描述

ps:稳定性可以根据 两个相同的数字相对位置是否会改变来判断

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值