屌丝的常用算法-----two

由于比较晚了,那我们今天我们说说插入排序。。。

排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。

我们这里说说八大排序就是内部排序。

1、插入排序---直接插入排序

有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法--插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。

插入排序的基本思想是:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。

 #include <stdio.h>
 
 #define NUM(a) (sizeof(a)/sizeof(*a)) 
 
 int insertSort(int *arr, const int n)
 {
     //型参条件判断
     if(NULL == arr || 0 >= n)
     {
         return -1;
     }
     
     int i = 0;    //用于循环使用
     int j = 0;    //同上
     int k = -1;    //用于记录拿出的比较的数据下标
     int tmp = -1;    //用于记录比较数据
     for(i = 1; i < n; i++)
     {
         k = i;            //记录比较的数据的下标
         tmp = arr[k];    //记录比较的数据
         //从小到大排序
         for(j = i - 1; (0 <= j)&&(tmp < arr[j]); j--)
         {
             //条件满足时数据后移
             arr[k] = arr[j];
             k = j;    
         }
         arr[k] = tmp;
     }
     return 0;
 }
 
 int print_array(const int *arr, const int n)
 {
     //型参条件判断
     if(NULL == arr || 0 >= n)
     {
         return -1;
     }
     
     //遍历数组
     int i = 0;
     for(i = 0; i < n; i++)
     {
         printf("%d ", *(arr+i));
     }
     printf("\n");
     return 0;
 }
 
 int main(void)
 {
     int arr[] = { 12, 51, 15, 16, 33, 11, 99, 52, 16, 5, 33, 18};
     printf("排序之前:");
     print_array(arr, NUM(arr));
     insertSort(arr, NUM(arr));
     printf("排序之后:");
     print_array(arr, NUM(arr));
     
     return 0;
 }
 
 
 /*
 执行结果:
     排序之前:12 51 15 16 33 11 99 52 16 5 33 18
     排序之后:5 11 12 15 16 16 18 33 33 51 52 99
 */

2、插入排序希尔排序

希尔排序(Shell Sort)是插入排序的一种。是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。

 #include <stdio.h>
 
 #define NUM(a) (sizeof(a)/sizeof(*a)) 
 
 int insertSort(int *arr, const int n)
 {
     //型参条件判断
     if(NULL == arr || 0 >= n)
     {
         return -1;
     }
     
     int i = 0;    //用于循环使用
     int j = 0;    //同上
     int k = -1;    //用于记录拿出的比较的数据下标
     int tmp = -1;    //用于记录比较数据
     int gap = n;    //增量大小
     do
     {
         gap = gap / 3 + 1;
         for(i = gap; i < n; i+=gap)
         {
             k = i;            //记录比较的数据的下标
             tmp = arr[k];    //记录比较的数据
             //从小到大排序
             for(j = i - gap; (0 <= j)&&(tmp < arr[j]); j-=gap)
             {
                 //条件满足时数据后移
                 arr[k] = arr[j];
                 k = j;    
             }
             arr[k] = tmp;
         }
     }while(1 < gap);
     return 0;
 }
 
 int print_array(const int *arr, const int n)
 {
     //型参条件判断
     if(NULL == arr || 0 >= n)
     {
         return -1;
     }
     
     //遍历数组
     int i = 0;
     for(i = 0; i < n; i++)
     {
         printf("%d ", *(arr+i));
     }
     printf("\n");
     return 0;
 }
 
 int main(void)
 {
     int arr[] = { 12, 51, 15, 16, 33, 4, 8, 19, 31, 11, 99, 52, 16, 5, 33, 18};
     printf("排序之前:");
     print_array(arr, NUM(arr));
     insertSort(arr, NUM(arr));
     printf("排序之后:");
     print_array(arr, NUM(arr));
     
     return 0;
 }
 
 
 /*
     运算结果:
     排序之前:12 51 15 16 33 4 8 19 31 11 99 52 16 5 33 18
     排序之后:4 5 8 11 12 15 16 16 18 19 31 33 33 51 52 99
 */
时间: 2024-08-09 05:20:37

屌丝的常用算法-----two的相关文章

五大常用算法

http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741370.html 分治算法 一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)-- 任何一个可以用计

推荐系统中常用算法 以及优点缺点对比

推荐系统中常用算法 以及优点缺点对比 在 推荐系统简介中,我们给出了推荐系统的一般框架.很明显,推荐方法是整个推荐系统中最核心.最关键的部分,很大程度上决定了推荐系统性能的优劣.目前,主要的推荐方法包括:基于内容推荐.协同过滤推荐.基于关联规则推荐.基于效用推荐.基于知识推荐和组合推荐. 一.基于内容推荐 基于内容的推荐(Content-based Recommendation)是信息过滤技术的延续与发展,它是建立在项目的内容信息上作出推荐的,而不需要依据用户对项目的评价意见,更多地需要用机 器

(转)常用算法(Algorithm)的用法介绍

2算法部分主要由头文件<algorithm>,<numeric>和<functional>组成. 2<algorithm>是所有STL头文件中最大的一个,其中常用到的功能范围涉及到比较.交换.查找.遍历操作.复制.修改.反转.排序.合并等等. 2<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作. 2<functional>中则定义了一些模板类,用以声明函数对象. 2STL提供

[转]五大常用算法:分治、动态规划、贪心、回溯和分支界定

Referred from http://blog.csdn.net/yapian8/article/details/28240973 分治算法 一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求

特征选择常用算法综述

特征选择的一般过程: 1.生成子集:搜索特征子集,为评价函数提供特征子集 2.评价函数:评价特征子集的好坏 3.停止准则:与评价函数相关,一般是阈值,评价函数达到一定标准后就可停止搜索 4.验证过程:在验证数据集上验证选出来的特征子集的有效性 1.生成子集 搜索算法有 完全搜索.启发式搜索.随机搜索 三大类. (1)完全搜索 <1>宽搜(Breadth First Search):时间复杂度高,不实用 <2>分支界限搜索(Branch and Bound):其实就是宽搜加上深度的限

五大常用算法:分治、动态规划、贪心、回溯和分支界定

苹果的WWDC ,除了发布了os x 10.10 和IOS8 外,还推出了Swift.详细点击这里 代码总体风格有点像Java,也有点像javascript. 下面给出一些代码段(来自苹果官方手册): println("Hello, world") "var myVariable = 42 myVariable = 50 let myConstant = 42" 摘录来自: Apple Inc. "The Swift Programming Languag

轻松看懂机器学习十大常用算法

轻松看懂机器学习十大常用算法 通过本篇文章可以对ML的常用算法有个常识性的认识,没有代码,没有复杂的理论推导,就是图解一下,知道这些算法是什么,它们是怎么应用的,例子主要是分类问题. 每个算法都看了好几个视频,挑出讲的最清晰明了有趣的,便于科普. 以后有时间再对单个算法做深入地解析. 今天的算法如下: 决策树 随机森林算法 逻辑回归 SVM 朴素贝叶斯 K最近邻算法 K均值算法 Adaboost 算法 神经网络 马尔可夫 1. 决策树 根据一些 feature 进行分类,每个节点提一个问题,通过

总结Objective-c常用算法

今天是星期天,想睡到10点起床,结果认为自己太奢侈了,不能这么做,于是把闹钟设置成了6:30:结果终于9:36醒了,起床,无缘无故迟了,好吧,就算太累了吧,周天就原谅自己一回.终于到了中午,辗转反侧,用objective-c去实现一个计算器程序,调试不成四则运算计算器算法,总是差那么一点点,却还是差那么一点点,运行不起来,终于决定出去办点事然后回去教室问同学……….,后来发现,这些算法非常重要,就算摔倒了爬起来也要记得,切记,切记,由四则运算算法得到的启示,然后查找资料总结的objective-

数据结构图的常用算法总结

本人在校期间写了一个win32应用程序,用于回顾算法导论图的常用算法(图中边的权值为两个圆心的像素点的距离) 1.dijkstra算法求两点之间最短路径: 贪心算法用优先队列实现,每次选择距离起点路径和最短的顶点弹出队列,此顶点最短路径就已经确定 初始图如下 选择起点如W 选择终点如下: 显示路线: 1) 2) 3) 4) 打开数据,第一行为W距离S点距离,剩下为边的距离一遍参考 470 A <-> D 120 D <-> C 71 C <-> E 93 E <-