排序算法实现

自己实现的排序算法,用来复习

#include <iostream>

using namespace std;

void swap(int &a,int &b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
}

void headp_adjust(int *a,int s,int m)
{
    int temp= a[s];
    //i =2*i+1表示左边的还在节点
    for (int i = 2 * s+1; i <= m; i =2*i+1)
    {
        if (i < m && a[i] < a[i + 1])
            i++;
        if (temp < a[i])   //此处必须与temp比较大小,不是a[s],因为此时的a[s]处的值并没有与父节点交换
        {
            a[s] = a[i];
            s = i;
        }
        else
            break;
    }
    a[s] = temp;
}

void bubble_sort(int *a,int len)
{
    int flag = 1;
    for (int j = 1; j <= len - 2 && flag; j++)
    {
        flag = 0;
        for (int i = len - 1; i >= j; i--)
        {
            if (a[i] < a[i - 1])
            {
                swap(a[i], a[i - 1]);
                flag = 1;
            }
        }

        //for (int i = 0; i < len; i++)
        //{
        //  cout << a[i] << " ";
        //}
        //cout << endl;
    }
}

void select_sort(int *a,int len)
{
    int min;
    for (int i = 0; i < len - 1; i++)
    {
        min = i;
        for (int j = i + 1; j <= len - 1; j++)
        {
            if (a[min] > a[j])
                min = j;
        }
        if (min != i)
            swap(a[i],a[min]);
    }
}

void insert_sort(int *a, int len)
{
    for (int i = 1; i < len; i++)
    {
        int temp;
        if (a[i] < a[i - 1])
        {
            temp = a[i];
            int j;
            for (j = i - 1; j>=0 && a[j] > temp; j--)   //加入j>=o的限制,否则会越界
            {
                a[j + 1] = a[j];
            }
            a[j + 1] = temp;
        }
    }
}

void shell_sort1(int *a,int len)
{
    for (int d = len / 2; d > 0; d /= 2) //指定增量
    {
        for (int i = 0; i < len-d; i++)  //对各段数据分别用直接插入排序
        {
            for (int j = d+i; j < len; j += d) //指定插入排序的数据
            {
                int temp;
                if (a[j] < a[j - d])
                {
                    temp = a[j];
                    int k;
                    for (k=j-d;k>=0 && a[k]>temp;k -=d)
                    {
                        a[k + d] = a[k];
                    }
                    a[k+d] = temp;
                }
            }
        }
    }
}

void shell_sort2(int *a, int len)
{
    for (int d = len / 2; d > 0; d /= 2) //使用希尔增量
    {
        for (int i = d; i < len; i += 1) //首先处理全部字段的第一个数,再是第二个数
        {
            int temp;
            if (a[i] < a[i - d])
            {
                temp = a[i];
                int j;
                for (j = i - d; j >= 0 && a[j] > temp; j -= d)
                {
                    a[j + d] = a[j];
                }
                a[j + d] = temp;
            }
        }
    }
}

void shellsortHb(int p[], int n)
{
    int d, i, j, temp;
    /* d = 1, 3, 7, 15, 31 ... 2^i-1 */
    for (d = 1; d <= n / 4; d = d * 2 + 1);//产生最大的那个数
    for (; d > 0; d = (d - 1) / 2)
    {
        for (i = d; i < n; i++)
        {
            temp = p[i];
            for (j = i - d; j >= 0 && p[j] > temp; j -= d)
            {
                p[j + d] = p[j];
            }
            p[j + d] = temp;
        }
    }
}

void stack_sort(int *a,int len)
{
    for (int i = len/2-1; i >= 0; --i)
    {
        headp_adjust(a, i, len-1);

        //for (int i = 0; i < len; i++)
        //{
        //  cout << a[i] << " ";
        //}
        //cout << endl;
    }


    cout << endl;
    for (int j=len-1;j>0;j--)
    {
        swap(a[0],a[j]);
        headp_adjust(a, 0, j-1);
        //for (int i = 0; i < len; i++)
        //{
        //  cout << a[i] << " ";
        //}
        //cout << endl;
    }
}


//归并排序 递归实现
void merge(int *a,int low,int mid,int high)
{
    int *buffer = new int[high-low+1];
    int i = low, j = mid + 1, k = 0;
    while (i<=mid && j<=high)
    {
        if (a[i] < a[j])
            buffer[k++] = a[i++];
        else
            buffer[k++] = a[j++];
    }

    while (i<=mid)
    {
        buffer[k++] = a[i++];
    }

    while (j <= high)
    {
        buffer[k++] = a[j++];
    }
    for (i = 0; i < high - low + 1; i++)
    {
        a[low + i] = buffer[i];
    }
    delete[] buffer;
}

void merge_sort1(int *a, int low, int high)
{
    int mid = (low + high) / 2;
    if (low < high)
    {
        merge_sort1(a, low, mid);
        merge_sort1(a,mid+1,high);
        merge(a,low,mid,high);
    }
}

//归并排序非递归实现
//参数和递归略不同,n代表数组中元素个数,即数组最大下标是n-1 
void merge_sort2(int *a, int n)
{
    int size = 1, low, mid, high;
    while (size <= n - 1)  //保证右半merge数组至少有一个元素
    {
        low = 0;
        while (low + size <= n - 1)//low + size 表示右半数组的第一个元素下标,即它的下标应该在数组界限内,如果右半部分不存在,则左半部分不做处理
        {
            mid = low + size - 1;
            high = mid + size;
            if (high > n - 1)
                high = n - 1;
            merge(a, low, mid, high);
            low = low+2*size;
        }
        size *= 2;
    }
}

int main()
{
    int a[10] = {0,50,10,90,30,70,40,80,60,20};
    int b[10] = {9,5,4,3,7,1,8,6,0,2};
    /*stack_sort(a, 9);*/
    /*bubble_sort(a, 9);*/
    /*select_sort(a,9);*/
    /*insert_sort(a,9);*/
    /*shell_sort1(b,10);*/
    //ShellSort(a,10);
    /*shellsortHb(a,10);*/
    /*merge_sort1(b,0,9);*/
    merge_sort2(b, 10);
    cout << endl;
    for (auto s:b)
    {
        cout << s << " ";
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值