常见排序算法02

1 插入排序
2 希尔排序

1 插入排序

不废话,直接上例子代码。
看下列步骤:




总结:

下面给出两种插入排序的代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>#define MAX_SIZE 10//插入法排序
int InsertSort(int arr[],int len){//将一个无序数组分成有序部分和无序部分,一般设第一个元素为有序部分,所以i=1开始遍历int i,j,tmp;for(i=1;i<len;i++){if(arr[i-1] > arr[i]){tmp=arr[i];for(j=i-1; j>=0 && tmp<arr[j]; j--){arr[j+1]=arr[j];  //后移}arr[j+1]=tmp;   }//arr[j+1]=tmp;   //为什么写这里出错了? 因为不执行if的话就没必要//再执行这条语句,且tmp和j没被初始化}return 0;
}//插入法排序2  上面的更好 将if提出来先判断 减少执行第二个for循环 且减少一个if判断
int InsertSort2(int arr[],int len){int i,j;int tmp=0;for(i=1;i<len;i++){tmp=arr[i];for(j=i-1;j>=0 && tmp<arr[j];j--){if(arr[j+1]<arr[j]){arr[j+1]=arr[j];}}//如果tmp不是原来的 说明后移了if(tmp!=arr[i]){arr[j+1]=tmp;}}return 0;
}//输出数组
int PrintArr(int arr[],int len){for(int i=0;i<len;i++){printf("%d ",arr[i]);}printf("\n");return 0;
}int main(){//创建数组并用随机数赋值int arr[MAX_SIZE];srand((unsigned int)time(NULL));for(int i=0;i<MAX_SIZE;i++){arr[i]=rand()%100;}//打印PrintArr(arr,MAX_SIZE);//插入法排序InsertSort2(arr,MAX_SIZE);//打印PrintArr(arr,MAX_SIZE);return 0;
}

2 希尔排序:


代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<sys/timeb.h>     //获取当前时间头文件#define MAX_SIZE 100000//插入法排序
int InsertSort(int arr[],int len){//将一个无序数组分成有序部分和无序部分,一般设第一个元素为有序部分,所以i=1开始遍历int i,j,tmp;for(i=1;i<len;i++){if(arr[i-1] > arr[i]){tmp=arr[i];for(j=i-1; j>=0 && tmp<arr[j]; j--){arr[j+1]=arr[j];  //后移}arr[j+1]=tmp;   }}return 0;
}//希尔排序
int ShellSort(int arr[],int len){//增量,即分组的个数,先初始化为lenint increasement=len;int i,j,k;do{//先确定增量的值。根据程序员大量实战经验,它的值为increasement/3+1;初始值为数组长度increasement = increasement/3+1;    //分increasement组for(i=0;i<increasement;i++){        //进行increasement次插入排序//下面j=i+increasement别忘记加i了for(j=i+increasement;j<len;j=j+increasement){       //开始进行插入排序 if(arr[j]<arr[j-increasement]){                 //int tmp=arr[j];for(k=j-increasement;k>=0 && tmp<arr[k];k=k-increasement){arr[k+increasement]=arr[k];}arr[k+increasement]=tmp;}}}}while(increasement>1);   //因为increasement最后肯定为1,所以用dowhile先执行最后一次在退出   dowhile是不为真才停止执行return 0;
}
// 总结:实际上就是将一个数组在插入排序时 将加1操作换成增量increasement//打印数组
int PrintArr(int arr[],int len){for(int i=0;i<len;i++){printf("%d ",arr[i]);}printf("\n");return 0;
}//打印当前时间函数
long GetPcurTime(){struct timeb tb;ftime(&tb);return tb.time*1000+tb.millitm;    //乘以1000是将秒换成毫秒单位
}int main(){//创建数组并用随机数赋值int arr[MAX_SIZE];int arr2[MAX_SIZE];srand((unsigned int)time(NULL));for(int i=0;i<MAX_SIZE;i++){int tmp=rand()%10;arr[i]=tmp;arr2[i]=tmp;}//插入法排序//InsertSort(arr,MAX_SIZE);//希尔排序//ShellSort(arr,MAX_SIZE);//打印//PrintArr(arr,MAX_SIZE);//测量两种排序的执行时间,比较效率long start_time=GetPcurTime();ShellSort(arr2,MAX_SIZE);long end_time=GetPcurTime();printf("希尔排序%d次的时间为:%d\n",MAX_SIZE,end_time-start_time);start_time=GetPcurTime();InsertSort(arr,MAX_SIZE);end_time=GetPcurTime();printf("插入排序%d次的时间为:%d\n",MAX_SIZE,end_time-start_time);return 0;
}

测试两个排序的执行时间可知,希尔比插入好。单位毫秒。

常见排序算法02之插入排序与希尔排序相关推荐

  1. ds排序--希尔排序_图解直接插入排序和希尔排序

    前言 这次我们介绍插入类排序中的 直接插入排序 和 希尔排序 . 对于直接插入排序,虽然它的时间复杂度也是 O(n^2) ,但是在元素 有序或近乎有序 的情况下,时间复杂度可以降为 O(n) ,效率比 ...

  2. 八大排序:冒泡排序、插入排序、希尔排序、选择排序、堆排序、归并排序、快速排序、基数排序

    [前言] 所有代码段都以升序为例,数组下标从0开始.排序的稳定性即:任意两个相等的数据,排序前后的相对位置不发生变化. [冒泡排序(Bubble Sort)] 它重复地访问过要排序的元素序列,依次比较 ...

  3. 七内部排序算法汇总(插入排序、Shell排序、冒泡排序、请选择类别、、高速分拣合并排序、堆排序)...

    写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的随意序列,又一次排列成一个按keyword有序的序列.因此排序掌握各种排序算法很重要. 对以下介绍的各个排序,我们假定全部排 ...

  4. 2.C++-选择排序、冒泡排序、插入排序、希尔排序、归并排序、快速排序

    1.常用排序算法介绍 一个排序算法的好坏需要针对它在某个场景下的时间复杂度和空间复杂度来进行判断.并且排序都需要求其稳定性,比如排序之前a在b前面,且a=b,排序之后也要保持a在b前面. 常用排序算法 ...

  5. 常见排序算法2–直接插入法vs希尔排序法

    常见排序算法–直接插入法vs希尔排序法 首先,我们通过一个例子来了解直接插入算法 例如,对原始数组{15,24,3,49,10}进行直接插入排序(由小到大进行排序) 第一个数15无法比较,第二个数24 ...

  6. 【排序综合】直接插入排序,希尔排序,快速排序,堆排序,冒泡排序,简单选择排序的简介,实现和算法复杂度分析

    目录 1. 直接插入排序 1.1 直接插入排序简介 1. 什么是直接插入排序 2. 排序思想 1.2 排序实现 1. 排序代码 2. 复杂度分析: 3. 运行结果: 1.3 学习链接 2. 希尔排序( ...

  7. C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】

    目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...

  8. 关于js数组的六种算法---水桶排序,冒泡排序,选择排序,快速排序,插入排序,希尔排序的理解。...

    1.水桶排序: 原理:首先找到arr这个数组中的最大项 max(此处为88),然后创建一个新的数组bucket,bucket数组长度为max,然后for循环遍历,在bucket的索引为arr[i]的添 ...

  9. 十大排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

    冒泡排序.选择排序.插入排序.希尔排序.归并排序.快速排序.堆排序.计数排序.桶排序.基数排序的动图与源代码. 目录 关于时间复杂度 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 ...

  10. 【排序算法】python 十大经典排序算法(全网最详)

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算法有:插入排序.希尔排序.选 ...

最新文章

  1. python小乌龟消除_悄悄告诉你,Python 里面有一只小乌龟
  2. 实验代做 行人识别_CVPR 2020 | 针对VI-ReID的分层跨模态行人识别
  3. 定制或外购适配器规格需求列表
  4. 前端学习(2653):对比vue2中的实现
  5. qml demo分析(customgeometry-贝塞尔曲线)
  6. css3缩放 transform: scale() 使用缩放之后顶点对齐问题
  7. 福师计算机应用基础期末,福师2015计算机应用基础》期末试卷A123
  8. 对象与控件如何建立关联
  9. linux/windows下查看目标文件.a/.lib的函数符号名称
  10. jdk源码阅读-HashMap
  11. pair用法 lower_bound upper_bound
  12. UGUI 在面板经常使用的表格布局制作
  13. 从零开始攻略PHP(9)——错误和异常处理
  14. JSP中EL表达式不起作用
  15. 重定向后路径上自动添加jsessionid=
  16. maya中英文对比_[转载]maya中英文对照
  17. Windows蓝屏自动修复无法修复你的电脑
  18. Piranha介绍:过期代码自动删除的开源工具
  19. 2022-2027年中国双摄像头手机行业发展监测及投资战略研究报告
  20. MATLAB 学习笔记(3)MATLAB 矩阵的进阶操作

热门文章

  1. 目标检测Anchor是什么?怎么科学设置?人人都能彻底搞懂的Anchor深度解析
  2. 计算机专业实训图片,实训一图片的简单处理_计算机软件及应用_IT计算机_专业资料...
  3. 关于 opengl3.3 - 4.1 ABO 的感触. 传统 VBO往 ABO+VBO的 代码移植
  4. 测试渲染用什么软件,【2人回答】3DMax2014用的是VRay3.0测试和出图渲染参数怎么设置-3D溜溜网...
  5. lgv50进入工程模式_LG手机工程模式进入方法及菜单指令翻译(适用G6、G7、V20、V30等)...
  6. WhatsApp Business 与 Google My Business:它们的运作方式和不同之处
  7. 知识库构建前沿:自动和半自动知识提取
  8. 压缩包修改所属目录Linux,LINUX 压缩、解压、打包文件 修改文件所属组
  9. ecshop 在确认收货时新增加商品评价并送消费积分功能
  10. jupyter报错EnvironmentLocationNotFound: Not a conda environment: /root/anaconda3/envs/anaconda3