经典算法复习-插入排序算法

温习《数据结构C语言版》,看到排序算法,感觉看不懂。

写到代码实现下,花费了很久才搞出来。

实现的跟书本上的有点不一样哦,不喜勿喷。

参考文章: http://blog.csdn.net/hguisu/article/details/7776068

#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("---------insert sort algorithm------------\n\n");

    //等待排序数组
    int a[] = {17,35,25,4,88,67,49};

    printf("\n----------Orgin Array-------------\n");
    print_array(a,sizeof(a)/sizeof(int));
    Sort_Insert(a,7);

    printf("\n-------After Sort--------\n");
    print_array(a,sizeof(a)/sizeof(int));

    return 0;
}

void print_array(int a[],int size)
{
    int i;
    for(i=0;i<size;i++)
    {
        printf("%d ",a[i]);
    }

    printf("\n");
}
/** \brief
 *
 * \param
 * \param
 * \return
 *
 */
void InsertPass(int a[],int size,int index)
{
    int i;
    int j;
    int t = a[index];
    int insert_pos = -1;

    //右移,插入
    //找出插入的位置
    for(i=0; i<index; i++)
    {
        if(a[i] > t)
        {
         insert_pos = i;
         break;
        }
    }

    //printf("insert pos : %d\n", insert_pos);

    if(insert_pos == -1){
        return;
    }
    //插入位置以后的元素右移
    for(j=index;j>insert_pos;j--)
    {
        //printf("array[%d] = %d right move\n", j,a[j-1]);
        a[j] = a[j-1];

    }

    //插入
    a[insert_pos] = t;
}

//插入排序
void Sort_Insert(int a[],int size)
{
    int i;

   for(i=1;i<size;i++)
   {
     InsertPass(a,size,i);
     printf("\nround %d: ",i);
     print_array(a,7);
   }
}

  

时间: 2024-10-12 10:33:09

经典算法复习-插入排序算法的相关文章

[数据结构和算法]折半插入排序算法笔记

/// <summary> /// 步骤: /// 1.记录当前待排元素 /// 2.标记顺序表有序查找区域下界和上界 /// 3.在顺序表有序查找区域中折半查找等待排序元素的位置 /// 4.把顺序表有序查找区域的某些元素后移一位,以空出位置给等待排序的元素 /// 5.在空出的位置填写当前排序元素 /// </summary> /// <param name="elements"></param> static void SqList

java 算法之插入排序算法

这算是经典算法了,网上很多朋友都写了,有的我看不懂,所以我自己按照我自己所理解的写出来, 我觉得只有自己写出来的东西才是自己的 主要思路: 1.将数组的前两个数进行大小排序 2.将第三个数与前两个数进行比较,将第三个数插入到合适的位置 3.循环 其实这样来将对于新手来说,将其变成代码是有点困难的. 我也是.我很笨,没办法,只有将详细的一步一步写出来 // 数组 [3,5,1,2,8,9] 如有这样一个数组,按照上面的思路,我们从第二个数开始,就是5,5要跟3比较,第二个位置就是5要插入的位置 [

算法之-归并排序算法,插入排序算法

一.归并排序法 归并排序是效率还是比較高的算法.当中的分治法是经常使用的一种解决这个问题的方法,如今流行的云计算事实上就是一种分治法的应用. 所谓的分治法,字面解释就是"分而治之",就是把一个复杂的问题分成两个或很多其它的同样或相似的子问题,直到最后子问题能够简单的直接求解.原问题的解即子问题的解的合并.这个思想在实际工作中的作用很大,特别是处理大数据和做复杂运算的时候. 归并排序的基础是归并操作merge,即将两个有序数组合并为一个有序数组. 归并排序的算法思路为: 第一次扫描数组,

算法复习——分块算法

题目: Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1 Output Sample Input 6 3 1 2 3 2 1 2 1 5 3 6 1 5 Sample Output 1 2 1 HINT 修正下: n <= 40000, m <= 50000 Source Vani原创 题解: 题解如上·····一个分块模板题打了我2个小时·····不得不说代码能力和专注度还不够···

【数据结果与算法】插入排序算法

java语言实现 void insertionSort(int[] A) { for(int i=1;i<A.length;i++) { int value=a[i]; int j=i-1; while(a[j]>value&&j>=0) { a[j+1]=a[j]; j--; } a[j]=value; } }

矿Java开发学习之旅------&amp;gt;Java排序算法经典的二分法插入排序

一.折半插入排序(二分插入排序) 将直接插入排序中寻找A[i]的插入位置的方法改为採用折半比較,就可以得到折半插入排序算法.在处理A[i]时,A[0]--A[i-1]已经按关键码值排好序.所谓折半比較,就是在插入A[i]时,取A[i-1/2]的关键码值与A[i]的关键码值进行比較,假设A[i]的关键码值小于A[i-1/2]的关键码值.则说明A[i]仅仅能插入A[0]到A[i-1/2]之间.故能够在A[0]到A[i-1/2-1]之间继续使用折半比較:否则仅仅能插入A[i-1/2]到A[i-1]之间

我的Java开发学习之旅------&gt;Java经典排序算法之插入排序

一.算法原理 插入排序法:所谓插入排序法乃是将一个数目插入该占据的位置. 假设我们输入的是 "53,27,36,15,69,  42" 我们从第二个数字开始,这个数字是27,我们的任务只要看看27有没有正确的位置,我们的做法是和这个数字左边的数字来比,因此我们比较27和53,27比53小,所以我们就交换27和53,原来的排列就变成了"27, 53, 36, 15, 69, 42 " 接下来,我们看第3个数字有没有在正确的位置.这个数字是36,它的左边数字是53,36

C语言排序算法复习

排序算法有很多种,这里在复习和分析的基础上,做一个自己的总结: 首先要知道有哪些排序算法,google一下,有云C语言7大经典排序算法(也有8大).主要包括冒泡排序,快速排序,选择排序,插入排序,希尔排序,归并排序,堆排序,8大的还有基数排序.各有各的版本,代码写法也各不相同.所以这里以整理思路为先,代码只是作为自己的一个备份. 搞清楚的概念:稳定排序和不稳定排序,就看序列中两个值相等的数,排完序之后的相对位置是否改变,如果改变了就不稳定. 内部排序和外部排序,只用到内存即可完成排序的就叫内部排

排序算法系列——插入排序

记录学习点滴,菜鸟成长记 接触算法是研究生期间做项目时,需要编写一些诸如GA.QGA的时候,第一次使用“排序”还是用的Java自带的Comparator接口.后来买了<算法导论>来看,发现果然所有知识都是有专业壁垒的,简单的一个问题尽然蕴藏着如此多的思想,发现此简直欣喜无比,遂决定要好好研究研究.只有深入后才发现,原来算法的不仅仅是按照逻辑顺序写个程序那么简单,好的算法要考虑到方方面面,最简单的时间复杂度就够我学习很长时间了. 将自己学习排序算法的一些理解和感悟记录于此,方便自己温故而知新.