首页 > 编程语言 >【练习】不同排序算法执行时间比较

【练习】不同排序算法执行时间比较

时间:2023-02-24 17:32:52浏览次数:39  
标签:count 元素 int 练习 ++ 算法 排序 data 1000

插入:

    template<typename DataType>
    void insert(DataType D[], int length) {
        DataType key;
        for (int j = 2; j < length; j++) {
             key = D[j];//先保存D[j]的位置,因为它可能会被替换
            int i = j - 1;
            while (i > 0 && D[i] > key) {
                D[i + 1] = D[i];//如果在j前面的元素比该元素大,将该元素后移动一个位置
                i--;//i继续前移进行扫描,直到它刚好大于它前面的元素 小于它后面的元素
            }
            D[i+1] = key;//插入刚刚的key值 注意是i+1
        }
}
    //们将D[0]作为哨兵元素,存储待排序元素

【练习】不同排序算法执行时间比较_sed

冒泡:

#include<stdio.h>
#include<time.h>
void swap(int& a, int& b) {
    int t;
    t = a;
    a = b;
    b = t;
}
void bubble(int a[], int n) {
    int i = n - 1;//i是下一趟需要参与排序交换的元素的最大下标
    while (i > 0) {
        int minindext = 0;//设置一开始的标志是0
        for (int j = 0; j < i; j++) {
            if (a[j + 1] < a[j]) {
                swap(a[j + 1], a[j]);
            }
            minindext = j;//此时为交换之后更小的元素的索引
        }
        i = minindext;

    }
}
int main()
{
    int a[1000] = { 0 };
    for (int i = 0; i < 1000; i++)
    {
        a[i] = rand() % 1000 + 1;
    }
    bubble(a, 1000);
    for (int i = 0; i < 1000; i++)
    {
        cout<<a[i]<<",";
    }
    printf("Time used = %.2f\n", (double)clock() / CLOCKS_PER_SEC);
}

注意:如果不写swap函数,而是直接在bubble函数中交换两个数字,发现它们最后并没有发生交换。
【练习】不同排序算法执行时间比较_sed_02

快速排序:

template<class T> int partition(T data[], int p, int r) {
    int i = p - 1; int j = p;
    for (j = p; j < r; j++) {
        if (data[j] <= data[r]) {
            i++;
           
            swap(data[i], data[j]);
        }
    }
    swap(data[i+1], data[r]);
    return i + 1;
}
template <class T>
void quickSort(T data[], int p, int r) {
    int position = 0;
    if (p < r) {
        position = partition(data, p, r);
        quickSort(data, p, position - 1);
        quickSort(data, position+1, r);
    }
}

int main()
{
    int a[1000] = { 0 };
    for (int i = 0; i < 1000; i++)
    {
        a[i] = rand() % 1000 + 1;
    }
    quickSort(a, 0,999);
    for (int i = 0; i < 1000; i++)
    {
        cout<<a[i]<<",";
    }
    printf("Time used = %.2f\n", (double)clock() / CLOCKS_PER_SEC);
}

易错点:swap(data[i+1], data[r]);
return i + 1;注意是i+1 ,如果写成i无法排序
我们设置变量p 和r 表示数组的首尾元素下标,选取数组最右边的元素为我们第一次排序的划界元素,记为S[r]。那么我们就需要将S[p],S[p+1],…,S[r–1]组成的序列进行子序列划分
我们设置变量i=p–1,即最前面元素的前一个,设置变量j = p。反复执行如下步骤:
(1)执行j+1,如果S[j]≤S[r],交换S[i+1]与S[j]的值,i=i+1,j=j+1;如果S[j]≥S[r],i 不变,j=j+1;
(2)到j=r–1 时,停止步骤(1)。
重复执行上述步骤直至停止后,交换S[i+1]与S[r]的值,划界元素放在了其最终位置上,其左边的元素均小于等于它,右边的元素均大于它。
【练习】不同排序算法执行时间比较_其他_03
归并排序:

void merge(int aa[], int b [], int c[],int lenA, int lenB) {
    int count = 0;
    int i = 0, j = 0;
    while (count < lenA + lenB) {
        if (aa[i] < b[j]) {
            c[count] = aa[i];
            count++;
            i++;

        }
        else {
            c[count] = b[j];
            count++;
            j++;
        }
        if (i == lenA) {
            while (j < lenB) {
                c[count] = b[j];
                count++;
                j++;
            }
        }
        else if(j == lenB){
            while (i < lenA) {
                c[count] = aa[i];
                count++;
                i++;
            }
        }
    }
}

void mergesort(int a[], int n) {
    if (n > 1) //记得要加判断条件n>1
    {
        int* b = new int[n / 2];
        int* c = new int[n - n / 2];
        for (int i = 0; i < n / 2; i++) {
            b[i] = a[i];
        }
        int k = n / 2;
        for (int j = 0; j < n - n / 2; j++) {
            c[j] = a[j + k];
        }
        
        mergesort(b, n / 2);
        mergesort(c, n - n / 2);
        merge(b, c, a, n / 2, n - n / 2);
    }
}
int main()
{
    int a[1000] = { 0 };
    for (int i = 0; i < 1000; i++)
    {
        a[i] = rand() % 1000 + 1;
    }
    mergesort(a, 1000);
    for (int i = 0; i < 1000; i++)
    {
        cout << a[i] << ",";
    }
    printf("Time used = %.2f\n", (double)clock() / CLOCKS_PER_SEC);
}

归并排序是排序两个已经排序好了的数组,原数组要先拆成两个子数组,
注意:一定不能遗漏对于i和j达到a或者b末尾的判断,否则会出现乱码。当i到达a的末尾,则遍历b剩下的数组直接赋给c
【练习】不同排序算法执行时间比较_数组_04
跟之前的对比归并排序时间是最长的。

标签:count,元素,int,练习,++,算法,排序,data,1000
From: https://blog.51cto.com/u_15980129/6084261

相关文章

  • 机器学习(2):KNN-近邻算法
    KNN​​KNN概述​​​​准备:使用Python导入数据​​​​numpy.array()​​​​实施KNN分类算法​​​​计算已知类别数据集中的点与当前点之间的距离​​​​按照距离递增次......
  • 《分布式技术原理与算法解析》学习笔记Day21
    分布式数据存储三要素什么是分布式数据存储系统?分布式存储系统的核心逻辑,就是将用户需要存储的数据根据某种规则存储到不同的机器上,当用户想要获取指定数据时,再按照规则......
  • 【算法】二分查找算法 (非递归)
    概念: 二分查找算法只适合从一个有序序列(如果一个列表不是有序序列,我们可以先把它排序成有序序列)中进行查找某个值,比如有序的数字序列或者字母序列.  注意:二分查......
  • JAVA 数组 数组算法 求平均值
    publicclassTest{publicstaticvoidmain(String[]args){int[]nums={1,2,3,4};//定义总和intsum=0;//定义平均值......
  • 算法随想Day22【回溯算法】| LC77-组合
    回溯算法理论基础回溯法,一般可以解决如下几种问题:组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合......
  • STATA:排序分类 序号
    //如果有变量ifoi则删除该变量,否则命令即结束,准备产生新变量ifoi,如果有则删除,没有则进行下一步capdropifoi//使用正则表达式//建立新变量ifoi,如果yjszyyq包含”经......
  • 国内“谁”能实现chatgpt,短期穷出的类ChatGPT简评(算法侧角度为主),以及对MOSS、ChatYuan
    1.ChatGPT简介【核心技术、技术局限】ChatGPT(全名:ChatGenerativePre-trainedTransformer),美国OpenAI研发的聊天机器人程序,于2022年11月30日发布。ChatGPT是人工智能......
  • JAVA 数组 数组算法 求最大值
    publicclassTest1{publicstaticvoidmain(String[]args){//需求:求最大值int[]nums={1,3,12,6,5};//定义最大值intma......
  • 点分治练习题单(动态更新)
    传送门有点难,慢慢做。1.P2634[国家集训队]聪聪可可比板子要简单一点,分治时寻找路径时用桶记录模数为\(0,1,2\)的个数,再进行\(01\)背包即可。统计答案时由于两点可......
  • 树剖练习题题解总和(动态更新)
    这篇博客的练习题题解1、P3384【模板】轻重链剖分/树链剖分模板题,详见此#include<iostream>#include<cstdio>#include<vector>usingnamespacestd;intn,m,r,p,t[......