基本的排序

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <math.h>

using namespace std;

struct ListNode
{
    int value;
    ListNode* next;
    ListNode(int value)
    {
        this->value = value;
    }
};

void BubbleSort(vector<int> &array)
{
    int len = array.size();

    for(int i=0;i<len;i++)
    {
        int tag=0;
        for(int j=0;j<len-i-1;j++)
        {
            if(array[j]>array[j+1])
            {
                swap(array[j],array[j+1]);
                tag=1;
            }
        }
        if(!tag)
            break;
    }
}

void SelectionSort(vector<int> &array)
{
    int len = array.size();
    for(int i=0;i<len;i++)
    {
        int m = i;
        for(int j=i+1;j<len;j++)
        {
            if(array[m]>array[j])
            {
                m=j;
            }
        }
        swap(array[i],array[m]);
    }
}

void InsertSort(vector<int> &array)
{
    int len = array.size();
    for(int i=0;i<len;i++)
    {
        for(int j=i;j>0;j--)
        {
            if(array[j]<array[j-1])
            {
                swap(array[j],array[j-1]);
            }
            else
                break;
        }
    }
}

void ShellSort(vector<int> &array)
{
    int len = array.size();
    int distance = len / 2;
    while(distance)
    {
        for(int i=0;i<distance;i++)
        {
            for(int j=i;j<len;j+=distance)
            {
                for(int k=j;k>i;k-=distance)
                {
                    if(array[k]<array[k-distance])
                    {
                        swap(array[k],array[k-distance]);
                    }
                    else
                        break;
                }
            }
        }

        distance/=2;
    }
}

void CountSort(vector<int> &array)
{

    int maxNum=array[0];
    int len = array.size();
    for(int i=1;i<len;i++)
    {
        maxNum = max(maxNum,array[i]);
    }

    int count[maxNum+1];
    memset(count,0, sizeof(count));
    for(int i=0;i<len;i++)
    {
        count[array[i]]++;
    }

    array.clear();

    for(int i=0;i<=maxNum;i++)
    {
        while(count[i]) {
            array.push_back(i);
            count[i]--;
        }
    }

}

void BucketSort(vector<int>& array)
{
    int len = array.size();
    if(len<=1)
        return;

    int minNum = array[0];
    int maxNum = array[0];

    for(int i=1;i<len;i++)
    {
        minNum = min(minNum,array[i]);
        maxNum = max(maxNum,array[i]);
    }
    if(minNum==maxNum)
        return;

    int n=1;
    int len2 = maxNum-minNum+1;
    if(len2>5)
    {
        n=2;
        len2 = (maxNum-minNum+1)/n + 1;
    }
    vector<int> buckets[len2];

    for(int i=0;i<len;i++)
    {
        buckets[(array[i]-minNum)/n].push_back(array[i]);
    }

    for(int i=0;i<len2;i++)
    {
        BucketSort(buckets[i]);
    }

    array.clear();
    for(int i=0;i<len2;i++)
    {
        for(int j=0;j<buckets[i].size();j++)
        {
            array.push_back(buckets[i][j]);
        }
    }

}

int getdigitNum(int x)
{
    int res=0;
    while(x)
    {
        x/=10;
        res++;
    }
    return res;
}

int getdigit(int x,int i)
{
    while(i)
    {
        x/=10;
        i--;
    }

    return x%10;
}

void radixSort(vector<int>& array)
{
    vector<int> a[10];

    int len = array.size();
    int times =0;
    for(int i=0;i<len;i++)
    {
        times = max(times,getdigitNum(array[i]));
    }

    for(int i=0;i<times;i++)
    {
        for(int j=0;j<10;j++)
            a[j].clear();

        for(int j=0;j<len;j++)
        {
            int number = getdigit(array[j],i);
            a[number].push_back(array[j]);
        }

        array.clear();
        for(int j=0;j<10;j++)
        {
            for(int k=0;k<a[j].size();k++)
                array.push_back(a[j][k]);
        }
    }

}


#define MAX 100
int b[MAX];
void init2()
{
    for(int i=0;i<MAX;i++)
    {
        b[i]=rand() % 100000;
    }
}

void init(vector<int>& array)
{
    array.clear();

    for(int i=0;i<MAX;i++)
    {
        array.push_back(b[i]);
    }
}


int main()
{

    init2();
    vector<int> array;
    init(array);

    BubbleSort(array);

    for(int i=0;i<array.size();i++)
    {
        cout<<array[i]<<" ";
    }
    cout<<endl;

    init(array);
    SelectionSort(array);

    for(int i=0;i<array.size();i++)
    {
        cout<<array[i]<<" ";
    }
    cout<<endl;

    init(array);
    InsertSort(array);
    for(int i=0;i<array.size();i++)
    {
        cout<<array[i]<<" ";
    }
    cout<<endl;

    init(array);
    ShellSort(array);
    for(int i=0;i<array.size();i++)
    {
        cout<<array[i]<<" ";
    }
    cout<<endl;

    init(array);
    CountSort(array);
    for(int i=0;i<array.size();i++)
    {
        cout<<array[i]<<" ";
    }
    cout<<endl;

    init(array);
    BucketSort(array);
    for(int i=0;i<array.size();i++)
    {
        cout<<array[i]<<" ";
    }
    cout<<endl;

    init(array);
    radixSort(array);
    for(int i=0;i<array.size();i++)
    {
        cout<<array[i]<<" ";
    }
    cout<<endl;
}
posted @ 2020-05-19 08:43  Shendu.CC  阅读(130)  评论(0编辑  收藏  举报