常用排序算法的比较

#include <iostream>
#include <vector>
#include <random>
#include <time.h>
using namespace std;

/*
2015.5.4 quicksort
*/
void swap(int &a, int &b)
{
    int temp = a;
    a = b;
    b = temp;
}
//分割取下标
int partition_QuickSort(vector<int>& nums, int begin, int end)
{
    if (nums.size() == 0)return -1;
    int pivot = nums[begin];
    int i = begin+1, j = end;
    while (i <= j)
    {
        while (i <=j&&nums[i] < pivot){ ++i; }
        while (j>=i&&nums[j] >= pivot){ --j; }
        if (i <= j)
        {
            swap(nums[i++], nums[j--]);
        }
    }
    swap(nums[begin], nums[j]);
    return j;
}
void quicksort(vector<int>& nums,int begin,int end)
{
    if (begin >=end)return;
    int Sortedindex=partition_QuickSort(nums, begin, end);
    quicksort(nums, begin, Sortedindex - 1);
    quicksort(nums, Sortedindex + 1, end);
}
void qsort(vector<int>& nums)
{
    quicksort(nums, 0, nums.size() - 1);
}
/*
endofqsort;
*/

/*
bubblesort 2014.5.4
*/
void bubblesort(vector<int> & nums)
{
    for (int  i = 1; i < nums.size(); i++)
    {
        for (int j = 0; j < nums.size()-i; j++)
        {
            if (nums[j]>nums[j + 1])swap(nums[j], nums[j + 1]);
        }
    }
}
/*
endof bubblesort
*/

/*
heapsort
*/
void sink(vector<int>& ATemp, int i)//i 是下沉index
{
    int j = 2 * i + 1;
    while (j<ATemp.size())
    {
        if (j + 1 < ATemp.size())
        {
            if (ATemp[j] < ATemp[j + 1])++j;//选最da
        }
        if (ATemp[i] < ATemp[j])
        {
            auto temp = ATemp[i];
            ATemp[i] = ATemp[j];
            ATemp[j] = temp;
            i = j;
            j = 2 * j + 1;
        }
        else
            break;
    }
}
void sink(vector<int>& ATemp, int i,int n)//i 是下沉index
{
    int j = 2 * i + 1;
    while (j<n)
    {
        if (j + 1 < n)
        {
            if (ATemp[j] < ATemp[j + 1])++j;//选最da
        }
        if (ATemp[i] < ATemp[j])
        {
            auto temp = ATemp[i];
            ATemp[i] = ATemp[j];
            ATemp[j] = temp;
            i = j;
            j = 2 * j + 1;
        }
        else
            break;
    }
}
void swim(vector<int>& A, int i)
{
    int j = (i - 1) / 2;
    while (j >= 0 && i != 0)
    {
        if (A[i] > A[j])
        {
            auto temp = A[j];
            A[j] = A[i];
            A[i] = temp;
            i = j;
            j = (j - 1) / 2;
        }
        else
            break;
    }
}
void insert(vector<int>& A, int num)
{
    A.push_back(num);
    swim(A, A.size() - 1);
}
int deletemax(vector<int> &A)
{
    if (A.size() > 0)
    {
        int temp = A[0];
        A[0] = A[A.size() - 1];
        A.pop_back();
        sink(A, 0);
        return temp;
    }
    else
    {
        return -1;//errrrrrrrrrrro
    }
}
void heapify(vector<int> &A)
{
    for (int i = A.size() / 2 - 1; i >= 0; i--)
    {
        sink(A, i);
    }
}
void heapsort(vector<int> & nums)
{
    heapify(nums);
    int N = nums.size();
    while (N>0)
    {
        swap(nums[0], nums[--N]);
        sink(nums, 0, N);
    }
}
/*
end of heapsort
*/

/*mergesort
2014.5.4
*/
void mergesortUtil(vector<int>& nums, int begin, int end)
{
    if (begin >= end)return;
    mergesortUtil(nums, begin, begin + (end - begin) / 2);
    mergesortUtil(nums, begin + (end - begin) / 2 + 1, end);
    int secondbegin = begin + (end - begin) / 2 + 1;
    int i = begin;
    int j = secondbegin;
    vector<int> ans;
    while (i <= begin + (end - begin) / 2 && j <= end)
    {
        if (nums[i] < nums[j])
        {
            ans.push_back(nums[i++]);
        }
        else
        {
            ans.push_back(nums[j++]);
        }
    }
    while (i == begin + (end - begin) / 2+1&&j<=end)
    {
        ans.push_back(nums[j++]);
    }
    while (i <= begin + (end - begin) / 2  && j == end+1)
    {
        ans.push_back(nums[i++]);
    }
    int index = 0;
    for (int i = begin; i <= end; i++)
    {
        nums[i] = ans[index++];
    }
}
void mergesort(vector<int> & nums)
{
    mergesortUtil(nums, 0, nums.size() - 1);
}
/*
endof mergesort
*/

/*
inserctionsort
*/

void inserctionsort(vector<int> &nums)
{
    for (int i = 1; i < nums.size(); i++)
    {
        for (int j = i; j >0&&(nums[j]<nums[j-1]); j--)//nums[i]的信息是从j=i获取的
        {
            swap(nums[j], nums[j - 1]);
        }
    }
}
/*
endofinserctionsort
*/

/*
selectionSort
*/
void selectionsort(vector<int>& nums)
{
    for (int i = 0; i < nums.size(); i++)
    {
        int minindex = i;
        for (int j = i+1; j < nums.size(); j++)
        {
            if (nums[minindex] > nums[j])minindex = j;
        }
        swap(nums[i], nums[minindex]);
    }
}
/*
endofSelectionSort
*/

/*
shellsort
*/
void shellsort(vector<int> & nums)
{
    int N = nums.size();
    int h = 1;
    while (h<N/4)
    {
        h = h * 4 + 1;
    }
    while (h>=1)
    {
        for (int i = h; i < nums.size(); i++)
        {
            for (int j = i; j >= h && (nums[j] < nums[j - h]); j -= h)
                swap(nums[j], nums[j - h]);
        }
        h /= 4;
    }
}

/*
endofshellsort
*/
bool isordered(vector<int>& nums)
{
    for (size_t i = 0; i < nums.size()-1; i++)
    {
        if (nums[i + 1] - nums[i] < 0)return false;
    }
    return  true;
}

vector<int> good_randvec(int number)
{
    static default_random_engine e;
    static uniform_int_distribution<int> u(-2147483648, 2147483647);
    vector<int> ret;
    for (size_t i = 0; i < number; i++)
    {
        ret.push_back(u(e));
    }
    return ret;
}

#define SIZE (100000)
int main()
{
    auto random_vec = good_randvec(SIZE);
    int time1 = clock();
                                  inserctionsort(random_vec);//插入
    int time2 = clock();
    cout << time2 - time1 << endl;
    cout << isordered(random_vec) << endl;

     random_vec = good_randvec(SIZE);
     time1 = clock();
                                     shellsort(random_vec);//希尔
    time2 = clock();
    cout << time2 - time1 << endl;
    cout << isordered(random_vec) << endl;

    random_vec = good_randvec(SIZE);
    time1 = clock();
                                 selectionsort(random_vec);//选择
    time2 = clock();
    cout << time2 - time1 << endl;
    cout << isordered(random_vec) << endl;

     random_vec = good_randvec(SIZE);
     time1 = clock();
                                            bubblesort(random_vec);//冒泡
     time2 = clock();
    cout << time2 - time1 << endl;
    cout << isordered(random_vec) << endl;

     random_vec = good_randvec(SIZE);
     time1 = clock();
                                         qsort(random_vec);//快排
      time2 = clock();
    cout << time2 - time1 << endl;
    cout << isordered(random_vec) << endl;

      random_vec = good_randvec(SIZE);
      time1 = clock();
                                    heapsort(random_vec);//堆排
     time2 = clock();
    cout << time2 - time1 << endl;
    cout << isordered(random_vec) << endl;

    random_vec = good_randvec(SIZE);
    time1 = clock();
                                   mergesort(random_vec);//归并
    time2 = clock();
    cout << time2 - time1 << endl;
    cout << isordered(random_vec) << endl;

    system("pause");
    return 0;
}

10W随机数,下面的O(nlogn)还是很给力的。

时间: 2024-07-29 17:57:28

常用排序算法的比较的相关文章

Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法

Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序. 先来看看 8种排序之间的关系: 1.直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2]

常用排序算法比较与分析

一.常用排序算法简述 下面主要从排序算法的基本概念.原理出发,分别从算法的时间复杂度.空间复杂度.算法的稳定性和速度等方面进行分析比较.依据待排序的问题大小(记录数量 n)的不同,排序过程中需要的存储器空间也不同,由此将排序算法分为两大类:[内排序].[外排序]. 内排序:指排序时数据元素全部存放在计算机的随机存储器RAM中. 外排序:待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中还需要对外存进行访问的排序过程. 先了解一下常见排序算法的分类关系(见图1-1) 图1-1 常见排

七种常用排序算法

七种常用排序算法 一.常见排序算法一览: 时间复杂度: 是一个函数,它定量描述了该算法的运行时间. 空间复杂度:一个算法在运行过程中临时占用存储空间大小的量度. 稳定性:保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同就稳定,反之不稳定. 视觉直观感受 7 种常用的排序算法 二.算法C#实现: 1. 直接插入排序: using System; using System.Collections.Generic; using System.Linq; using Sys

常用排序算法之——归并排序

归并排序的原理: 如果数组的元素个数大于1,则: 将数组平均分为两部分: 左边的数组归并排序:递归 右边的数组归并排序:递归 将两个各自有序的数组合并,需要一个额外的辅助数组,暂时保存合并结果:返回 否则,数组元素个数为1时,已经有序:直接返回. 稳定排序.时间复杂度在最坏.最好.平均情况下都为O(N lgN),空间复杂度为O(N). 代码: 1 #include <iostream> 2 using namespace std; 3 4 template<typename T>

常用排序算法之——快速排序

快速排序的原理: 首先找一个标兵值,等于某一个元素值:遍历数组,将数组分为小于标兵值和大于标兵值的两部分:然后分别对两个部分采用快速排序,递归. 分开数组时,维持一个指针,指向已找到小部分的最后一个元素:一个指针用于遍历. 不稳定排序算法.当数组已经有序时,时间复杂度最差,为O(N2),平均.最优情况下都为O(N lgN). 代码如下: 1 #include <iostream> 2 using namespace std; 3 4 template<typename T> 5 v

javascript常用排序算法实现

毕业后,由于工作中很少需要自已去写一些排序,所以那些排序算法都忘得差不多了,不过排序是最基础的算法,还是不能落下啦,于是找了一些资料,然后用Javascript实现了一些常用的算法,具体代码如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>

常用排序算法实现[交换排序之冒泡排序、快速排序]

相关知识 1. 稳定排序和非稳定排序: 稳定排序算法会依照相等的关键(换言之就是值)维持纪录的相对次序. 如果排序算法是稳定的,就是当有两个有相等关键的纪录R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前. 2. 内排序和外排序 在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序: 在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序. 3.算法分类 排序算法从理论上分为如下几类: (1) 交换排序法:

常用排序算法时间复杂度和空间复杂度简析

1. preface /**** *    This article will try to explain something about: *        --Bubble sort. *        --Quick sort. *        --Merge sort. *        --Heap sort. *    To read this, some prerequisites is necessary: *        --a survive skill in C pr

视觉直观感受7种常用排序算法

视觉直观感受若干常用排序算法 1 快速排序 介绍: 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项之可能性. 步骤: 从数列中挑出一个元素,称为 "基准"(pivo

Java 常用排序算法/程序员必须掌握的 8大排序算法

Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序. 先来看看 8种排序之间的关系: 1.直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排 好顺序的,现在要把第n 个数插到前