多种c++排序算法

shell 排序

1.插入排序的优化

2.步长:一开始设置为 元素个数/2

3.步长次排序:每次排序完,步长减一

     每次排序都以步长为间隔给所有元素分组,组内作插入排序。

 

  function.cpp中包括了冒泡排序,插入排序,选择排序,shell排序

#include "function.h"

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

}

/*冒泡排序*/
void Sort(int a[], unsigned int num)
{
    if(num<=1)return;
    for (int j = 0; j<num-1; ++j)
    {
        for (int i = 0; i < num-1-j; i++)
        {
            if (a[i]>a[i+1])
            {
                sawp(a[i], a[i+1]);
            }
    
         }
    }
    return;
}

/*选择排序*/
void Sort_2(int a[], unsigned int num)
{
    int min_num;
    if(num<=1)return;
for (int j=0; j<num-1; j++)
{
     min_num = j;
    for (int i = j+1; i < num; i++)
    {
        if (a[i]<a[min_num])
        {
            min_num = i;
        }
    }
    sawp(a[j],a[min_num]);
}
return;
}

/*插入排序1*/
void Sort_3(int a[], unsigned int num)
{
    if(num<=1)return;
    for (int i=1; i<num; i++)
    {
        for (int j = i; j > 0;j--)
            if (a[j-1] > a[j])
            {
                sawp(a[j] , a[j-1]);
            }
            else
                break;
    }
    return;
}

/*插入排序2*/
void Sort_4(int a[], unsigned int num)
{
    int temp;
    int j;
    for (int i = 1; i < num; i++)
    {
        temp = a[i];
        j = i - 1;
        while(a[j]>temp&&j>=0){
            a[j+1] = a[j];
            j--;
        }
        a[j + 1] = temp;
    }
}


/*shell排序:是插入排序的优化*/

void shell_sort(int a[], unsigned int num)
{
    int step;
    int temp;
    int j;
    step = num / 2;
    while(step>=1)
    {
        for (int i = 1; i<step; i++)
        {
            temp = a[i];
            j = i - step;
            while(a[j]>temp && j>=0)
            {
                a[j + step] = a[j];
                j -= step;
            }
            a[j+step] = temp;
        }
        step = step / 2;
    }

}

function.h

#ifndef FUNCTION_H
#define FUNCTION_H
void sawp(int &a, int &b);
void Sort(int a[], unsigned int num);
void Sort_2(int a[], unsigned int num);
void Sort_3(int a[], unsigned int num);
void Sort_4(int a[], unsigned int num);
void shell_sort(int a[], unsigned int num);
#endif

 

sort.cpp测试程序(随机生成10个数,测试各种排序算法)

#include <iostream>
#include <string>
#include <cstdlib>
#include "stdlib.h"
#include <time.h>
#include "function.h"

using namespace std;
#define NUMBER 10


int main()
{
    int a = 0;
    int b = 50;
    int t;
    int aim[NUMBER];
    srand((unsigned int ) time(NULL));

    for (size_t i = 0; i < NUMBER; i++) //产生10个随机数
    {
        t = (rand() % (b - a + 1)) + a;
        cout << t << endl;
        aim[i] = t;
    }
    // Sort(aim, NUMBER);
    // Sort_2(aim, NUMBER);
    // Sort_3(aim, NUMBER);
    Sort_4(aim,NUMBER);

    cout << "start" << endl;
    for (size_t i = 0; i < NUMBER; i++)
    {
    
        cout << aim[i] << endl;
    }

        


}

基数排序:空间复杂度高,时间复杂度最低,但是使用有限制,数组的值不能为负数,小数,排序数字不能重复,而且要事先知道数据的最大值。

/*基数排序,空间复杂度高,时间复杂度最低*/
void radix_sort(int a[], unsigned int length, int max)
{
    //创建一个临时数组
    int *b = new int[max+1];
    int j = 0;
    //数组b初始化
    for (int i = 0; i < max; i++)
        b[i] = -1;

    for (int i = 0; i<length; i++)
        b[a[i]]=a[i];

    for (int i = 0; i < max+1; i++)
    {
        if (b[i]!=-1)
        {
            a[j] = b[i];
            printf("i:%d, j:%d, a[j]:%d, b[i]:%d\n", i, j, a[j], b[i]);

            j++;
        }
        
    }

        delete[] b;
}

 

桶排序:是基数排序的一种优化,创建几个桶并且对桶进行编号(0~9),把每个数的取出个位,按顺序放入对应编号的桶中,得出一组排序结果。

在第一次排序结果的基础上,取出十位,放入桶内排序,得出第二次的排序结果

在第二次排序结果的基础上,取出百位,放入桶内排序,得出第3次的排序结果,排序完成。

/*桶排序*/

#include <cstring>
#define NUMBER 10
#define PEACK 1000


void bucket_sort(int a[], unsigned int num)
{

    for (int k = 1; k < PEACK; k*=10){
            //定义10个桶,每个桶里放10个数
            int temp[10][10];
            //初始化10个桶里面的数据
            memset(temp, -1, sizeof(int) *10*10);
            //将个位,十位,百位取出,赋值给temp素组
            for (int i = 0; i < num; i++)
            {
                int m = a[i] / k % 10;
                temp[m][i] = a[i];
                
            }
            int p = 0;
            //把temp数组赋值给a数组
            for (int i = 0; i < num; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    if (temp[i][j] != -1)
                        a[p++] = temp[i][j];
                }
            }

            for(int i = 0; i < num; i++)
            {
                printf("a[%d]=%d ", i, a[i]);
            }
              printf("\n");

    }
  
}


int main()
{
    int aim2[10] = {99, 12, 687, 431, 32, 0, 45, 76, 62, 231};
    for(int i=0; i<10; i++)
    {
            printf("aim2[i]=%d,  ", i, aim2[i]);
    }
    printf("\n");
    
    bucket_sort(aim2, NUMBER);
    cout << "start" << endl;
    for (size_t i = 0; i < NUMBER; i++)
    {
    
        cout << aim2[i] << endl;
    }


}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值