排序算法C++11实现——冒泡、选择、插入、希尔、堆、合并、快速排序(非递归)

来源:互联网 发布:苹果手机快速打开数据 编辑:程序博客网 时间:2024/05/19 17:49

Makefile

g++ -std=c++11 -o sort sort.cpp

代码

sort.cpp

#include <vector>#include <climits>#include <cassert>#include <algorithm>#include <array>#include <stack>

void bubbleSort(std::vector<int> &v){    std::size_t vsize = v.size();    assert(vsize <= INT_MAX);    int size = static_cast<int>(vsize);    bool hasSwap = true;    for (int i = 0; (i < size-1) && hasSwap; ++i)    {        for (int j = size-1; j > i; --j)        {            if (v[j] < v[j-1])            {                std::swap(v[j], v[j-1]);                hasSwap = true;            }        }    }}

void selectSort(std::vector<int> &v){    std::size_t vsize = v.size();    assert(vsize <= INT_MAX);    int size = static_cast<int>(vsize);    for (int i = 0; i < size-1; ++i)    {        int min = i;        for (int j = i+1; j < size; ++j)        {            if (v[min] > v[j])            {                min = j;            }        }        if (min != i)        {            std::swap(v[min], v[i]);        }    }}

void insertSort(std::vector<int> &v){    std::size_t vsize = v.size();    assert(vsize <= INT_MAX);    int size = static_cast<int>(vsize);    for (int i = 0; i < size-1; ++i)    {        if (v[i+1] < v[i])        {            int j = i;            int temp = v[j+1];            for (; (j >= 0) && (temp < v[j]); --j)            {                v[j+1] = v[j];            }            v[j+1] = temp;        }    }}

void shellSort(std::vector<int> &v){    std::size_t vsize = v.size();    assert(vsize <= INT_MAX);    int size = static_cast<int>(vsize);    int step = size;    do    {        step = step/3 + 1;        for (int i = 0; i < size-step; ++i)        {            if (v[i+step] < v[i])            {                int j = i;                int temp = v[j+step];                for (; (j >= 0) && (temp < v[j]); j -= step)                {                    v[j+step] = v[j];                }                v[j+step] = temp;            }        }    } while (step > 1);}

void heapAdjust(std::vector<int> &v, int node, int end){    std::size_t vsize = v.size();    assert(vsize <= INT_MAX);    int size = static_cast<int>(vsize);    assert(node < end && end <= size);    while (node < end)    {        int right = (node+1) << 1;        int left = right - 1;        if (left >= end)        {          return;        }        int max = left;        if ((right < end) && (v[right] > v[left]))        {            max = right;        }        if (v[node] >= v[max])        {          return;        }        std::swap(v[node], v[max]);        node = max;    }}void heapSort(std::vector<int> &v){    std::size_t vsize = v.size();    assert(vsize <= INT_MAX);    int size = static_cast<int>(vsize);    for (int i = (size>>1)-1; i >= 0; --i)    {        heapAdjust(v, i, size);    }    for (int i = size-1; i > 0; --i)    {        std::swap(v[0], v[i]);        heapAdjust(v, 0, i);    }}

void merge(std::vector<int> &v, std::vector<int> &vb, int begin, int middle, int end){    std::size_t vsize = v.size();    assert(vsize == vb.size());    assert(vsize <= INT_MAX);    int size = static_cast<int>(vsize);    assert((begin < middle) && (middle <= end) && (end <= size));    int i = begin, m = begin, n = middle;    while (m < middle && n < end)    {        vb[i++] = v[m] < v[n] ? v[m++] : v[n++];    }    while (m < middle)    {        vb[i++] = v[m++];    }    while (n < end)    {        vb[i++] = v[n++];    }}void mergeSort(std::vector<int> &v){    std::size_t vsize = v.size();    assert(vsize <= INT_MAX);    int size = static_cast<int>(vsize);    std::vector<int> vb(size, 0);    for (int step = 1; step < size; step<<=1)    {        for (int i = 0; i < size; i+=step)        {            int begin = i;            int middle = begin + step;            int end = middle + step;            merge(v, vb, begin, std::min(middle,size), std::min(end,size));        }        std::copy(vb.begin(), vb.end(), v.begin());    }}

int partition(std::vector<int>&v, int begin, int end){    std::array<int, 3> array{begin, end, begin+((end-begin)>>1)};    std::sort(array.begin(), array.end(), [&v](int x,int y){return v[x] < v[y];});    std::swap(v[array[1]], v[begin]);    int temp = v[begin];    while (begin < end)    {        while (begin < end && v[end] >= temp)        {            --end;        }        v[begin] = v[end];        while (begin < end && v[begin] <= temp)        {            ++begin;        }        v[end] = v[begin];    }    v[begin] = temp;        return begin;}void quickSort(std::vector<int> &v){    std::size_t vsize = v.size();    assert(vsize <= INT_MAX);    int size = static_cast<int>(vsize);    std::stack<std::pair<int, int>> s;    if (size > 1)    {        s.push({0, size-1});    }    while (!s.empty())    {        auto pair = s.top();        s.pop();        auto middle = partition(v, pair.first, pair.second);        if (pair.first < middle - 1)        {            s.push({pair.first, middle-1});        }        if (middle + 1 < pair.second)        {            s.push({middle+1, pair.second});        }    }}

main

#include <iterator>#include <iostream>int main(){    std::vector<int> v;    v.assign({2,8,10,3,12,9,5,11,0,6,4,13,1,7});    std::copy(std::begin(v), std::end(v), std::ostream_iterator<int>(std::cout, " "));    std::cout << std::endl << "bubble:  ";    bubbleSort(v);    std::copy(std::begin(v), std::end(v), std::ostream_iterator<int>(std::cout, " "));    std::cout << std::endl << "select:  ";    selectSort(v);    std::copy(std::begin(v), std::end(v), std::ostream_iterator<int>(std::cout, " "));    std::cout << std::endl << "insert:  ";    insertSort(v);    std::copy(std::begin(v), std::end(v), std::ostream_iterator<int>(std::cout, " "));    std::cout << std::endl << "shell:   ";    shellSort(v);    std::copy(std::begin(v), std::end(v), std::ostream_iterator<int>(std::cout, " "));    std::cout << std::endl << "heap:    ";    heapSort(v);    std::copy(std::begin(v), std::end(v), std::ostream_iterator<int>(std::cout, " "));    std::cout << std::endl << "merge:   ";    mergeSort(v);    std::copy(std::begin(v), std::end(v), std::ostream_iterator<int>(std::cout, " "));    std::cout << std::endl << "quick:   ";    quickSort(v);    std::copy(std::begin(v), std::end(v), std::ostream_iterator<int>(std::cout, " "));    std::cout << std::endl;    return 0;}

结果

2 8 10 3 12 9 5 11 0 6 4 13 1 7 bubble:  0 1 2 3 4 5 6 7 8 9 10 11 12 13 select:  0 1 2 3 4 5 6 7 8 9 10 11 12 13 insert:  0 1 2 3 4 5 6 7 8 9 10 11 12 13 shell:   0 1 2 3 4 5 6 7 8 9 10 11 12 13 heap:    0 1 2 3 4 5 6 7 8 9 10 11 12 13 merge:   0 1 2 3 4 5 6 7 8 9 10 11 12 13 quick:   0 1 2 3 4 5 6 7 8 9 10 11 12 13 
阅读全文
0 0
原创粉丝点击