数据结构-Sort

来源:互联网 发布:Sql 字符串转成数组 编辑:程序博客网 时间:2024/06/08 03:08

Sort好好复习了一下,不容易啊...

#include #include #include #include #include #include #include #include #include #include #include #include #include /*made by davidsu33 2017-6-14*/#define MAX_SHOW_COUNT 100//#define USE_DEPNUMSconstexpr int sortCount{200000000};using namespace std;typedef int DataType;typedef function SortFunc;templatevoid dumpData(Iterator start, Iterator end){    std::copy(start, end, ostream_iterator(cout, ","));    cout< m_data;    bool m_showData {true};};void SortModel::sort(){    if(!m_sortFunc){        return;    }    shuffleData();    cout<<"数据个数:"< m_data[i])        {            assert(false);            cout<<"排序错误!!!"<(cout, ","));    cout< arr[1])            swap(arr[0], arr[1]);    }}//插入排序void insert_sort(DataType *arr, int length){    if(length <= 2) {        return common_sort(arr, length);    }    show_sort_name("插入排序");    DataType tmp{0};    int j{0};    for(int i=1; i=0 && arr[j] > tmp; --j)        {            arr[j+1] = arr[j];        }        arr[j+1] = tmp;    }}//Shell排序void shell_sort(DataType *arr, int length){    if(length <= 2)        return common_sort(arr, length);    show_sort_name("希尔排序");    DataType tmp{0};    int i{0},j{0}, span= length/2;    while(span >= 1)    {        for(i=span; i=0 && tmp < arr[j]; j-=span)            {                arr[j+span] = arr[j];            }            arr[j+span] = tmp;        }        span /= 2;    }}/*!冒泡排序的特点,起点相同,终点的和等于length-1*///冒泡排序,往左冒泡void bubble_sort_left(DataType *arr, int length){    if(length <= 2)        return common_sort(arr, length);    show_sort_name("冒泡排序");    for(int i=length-1; i>0; --i)    {       for(int j=length-1; j>length-1-i; --j)       {           if(arr[j] < arr[j-1])           {               swap(arr[j], arr[j-1]);           }       }    }}//冒泡排序,往右冒泡void bubble_sort_right(DataType *arr, int length){    if(length <= 2) return common_sort(arr, length);    show_sort_name("冒泡排序");    for(int i=0; i arr[j])                ...          }          貌似第一眼很对,但是??,该数据达不到最后一个值,          排序一定要考虑边界问题,上面的写法改成          for(int j=1; j arr[j])          同样是正确的        */        for(int j=0; j arr[j+1])                swap(arr[j], arr[j+1]);        }    }}//冒泡排序void bubble_sort(DataType *arr, int length){    bubble_sort_right(arr, length);}/*ERROR It's not bubble sortvoid bubble_sort_optimize(DataType *arr, int length){    if(length <= 2) return common_sort(arr, length);    show_sort_name("冒泡排序(标志位优化)");    bool flag {false};    for(int i=0; i arr[j])            {                swap(arr[i], arr[j]);                flag = false;            }        }        if(flag)            break;    }}*/void bubble_sort_optimize(DataType *arr, int length){    if(length <= 2) return common_sort(arr,length);    show_sort_name("冒泡排序(标志位优化)");    bool flag{false};    for(int i=0; i arr[j+1])            {                swap(arr[j], arr[j+1]);                flag = false;            }        }        if(flag) break;    }}//快速排序void quick_sort_private(DataType *arr, int l, int r){    if(l >= r) return;    int index = (l+r)/2;    const int tmp{arr[index]};    /*!      找到适合于tmp值自己的位置    */    int i{l}, j{r};    while(i < j)    {        for(; i tmp)            {                arr[index] = arr[i];                index = i;                //cout<<"arr[i]>tmp"<<"("<"<index; --j)        {            if(arr[j] < tmp)            {                arr[index] = arr[j];                index = j;                //cout<<"arr[j]>tmp"<<"("<= high)    {        return;    }    int first = low;    int last = high;    int key = a[first];/*用字表的第一个记录作为枢轴*/    cout<<"need to find key= "<= key)        {            --last;        }        cout<());}void select_sort(DataType *arr, int length){    show_sort_name("直接选择排序");    int index{0};    for(int i=0; i arr[j])            {                index = j;            }        }        if(index != i)        {            swap(arr[i],arr[index]);        }    }}void heapfiy(DataType *arr, int i, int length){   //找到该节点的孩子节点(第一个非叶子节点的孩子一定是叶子节点)   int nChild = (2*i + 1);   if(nChild >= length) return;   /*!   选择左右子节点中大得那个,建立大根堆   */   if(nChild < (length-1) && arr[nChild] < arr[nChild+1])   {       nChild++;   }   /*!   由于从最后一个非叶子节点开始构建,所以子节点一定已经成立   */   if(arr[i] < arr[nChild])       swap(arr[i], arr[nChild]);   heapfiy(arr, nChild, length);}void heap_sort(DataType *arr, int length){    /*!将当前数据构建堆数据,二叉堆*/    show_sort_name("堆排序");    /*!从最后一个非叶子节点开始进行调整,一直调整到根节点*/    int lastNonLeaf{(length-2)/2};    for(int i=lastNonLeaf; i>=0; --i)    {       heapfiy(arr, i, length);    }    bool is_heap = std::is_heap(arr, arr+length);    if(!is_heap){        cout<<"构建堆错误!!!!"<0; --i)    {        swap(arr[i], arr[0]);        heapfiy(arr, 0, i);    }}/*! * \brief merge_private * \param arr * \param tmp * \param start * \param mid * \param end * 根据start,mid,end的索引信息来确定要归并的数据范围,将数据合并到tmp临时区中,合并完成后拷贝回arr */void merge_private(DataType *arr, DataType *tmp, int start, int mid, int end){    //i操作arr的第一个区块,j操作arr的第二个区块    //k操作tmp    int i{start}, j{mid+1}, k{start};    while(i != mid+1 && j != end+1)    {        /*!将区块中较小的数据归并到数组tmp中*/        if(arr[i] > arr[j])        {            arr[k] = arr[j];            ++j;        }        else        {            arr[k] = arr[i];            ++i;        }        k++;    }    /*!将区块中没有拷贝完的数据,[注:都是大数据]拷贝至临时数组*/    while(i != mid+1)    {        arr[k] = arr[i];        k++;        i++;    }    /*!将区块中没有拷贝完的数据,[注:都是大数据]拷贝至临时数组*/    while(j != end+1)    {        arr[k] = arr[j];        k++;        j++;    }    /*!已经将数据合并至tmp中,现在将数据拷贝回arr*/    for(int i=start; i<=end; ++i)    {        arr[i] = tmp[i];    }}/*! * \brief merge_sort_private * \param arr * \param tmp * \param start * \param end * 将数据切分成一组组的,分割到最小单位相邻距离=1,每组内的数据只有一个 */void merge_sort_private(DataType *arr, DataType *tmp, int start, int end){    if(!arr || !tmp) return;    if(start < end)    {        int mid = (start + end) /2;        merge_sort_private(arr, tmp, start, mid);        merge_sort_private(arr, tmp, mid+1, end);        merge_private(arr, tmp, start, mid, end);    }}/*!  归并排序  空间占用会增加一倍*/void merge_sort(DataType *arr, int length){    std::vector tmp(length);    merge_sort_private(arr, &tmp[0], 0, length-1);}void heap_test(){    vector v {1,2,3,4,8,10,100,100,8,9,66,89,14,56,890};    dumpData(v.begin(), v.end());    make_heap(v.begin(), v.end());    dumpData(v.begin(), v.end());}//==================================================int main(int argc, char *argv[]){    QCoreApplication a(argc, argv);    //SortModel(bubble_sort, sortCount).sort();    //SortModel(bubble_sort_optimize, sortCount).sort();    /*====性能测试(未做EXE优化) MAC (8g)系统测试====     * !2000万的数据量:     * heap_sort 12s     * shell_sort 14s     * quick_sort 8s     * merge_sort 3s     *     * 2亿的数据量:     * heap_sort 200s     * shell_sort 228s     * quick_sort 52s     * merge_sort 40s    */    /*SortModel(heap_sort, sortCount).sort();    SortModel(shell_sort, sortCount).sort();    */    //SortModel(quick_sort, sortCount).sort();    //SortModel(merge_sort, sortCount).sort();    /*for(int i=0; i<1000; ++i)        SortModel(merge_sort, sortCount).sort();    */    /*DataType arr[] {1,100,2,4,6,5,90,9,8};    constexpr int length = sizeof(arr)/sizeof(DataType);    bubble_sort_optimize(&arr[0], length);    dumpData(&arr[0], &arr[0]+length);    assert(std::is_sorted(&arr[0], &arr[0]+length, less()));    */    //for(int i=0; i<10;++i)    //    SortModel(bubble_sort, sortCount).sort();    //heap_test();    /*    SortModel(insert_sort, sortCount).sort();    SortModel(bubble_sort, sortCount).sort();    SortModel(shell_sort, sortCount).sort();    SortModel(quick_sort, sortCount).sort();    SortModel(select_sort, sortCount).sort();    SortModel(STL_qsort, sortCount).sort();    */    //SortModel(Qsort, sortCount, true).sort();    //for(int i=0; i<10; ++i)    //    SortModel(Qsort, sortCount, false).sort();    return 0;}

原创粉丝点击