数据结构与算法——插入类排序(直接插入排序,希尔排序)

一、直接插入排序

对于一个有序的序列,不断将后面的元素插入前面的有序序列,保持序列继续有序。

对于直接插入排序的思路:将要排序的元素保存,然后逐个和其前面的元素进行比较,如果前面的元素比其大,则将前面的元素后移一个。

时间复杂度为n*n

void insert_sort(int a[],int n)
{
   int i,j;
   int temp;
   for(i=1;i<n;i++)
   {
      temp = a[i];
	  j=i-1;
	  while((j>=0)&& (temp<a[j]))
	  {
	    a[j+1] = a[j];
		j--;
	  }

	  a[j+1] = temp;
   }

}

二、希尔排序

把整个序列分割成为若干个子序列,分别进行插入排序。待整个序列“基本有序”,再对全体序列进行排序。

#include <stdio.h>

void shell_sort(int a[],int n)
{
	int i,j,k,temp;
   //选择间隔为每次都除以2,取整数
	for(i=n/2;i>0;i=i/2)  //i为间隔
	{
	     for(j=i;j<n;j++)
		 {
           temp = a[j];
		   for(k=j-i;(k>=0)&&(temp<a[k]);k=k-i)
		   {
		      a[k+i] = a[k];

		   }
             a[k+i] = temp;
		 }
	}

	for(i=0;i<n;i++)
	{
	  printf("%d,",a[i]);
	}

}

void main()
{
    int a[] = {5,6,2,9,3,1,77,22,17};
	int n =9;
	shell_sort(a,n);

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-28 20:59:20

数据结构与算法——插入类排序(直接插入排序,希尔排序)的相关文章

排序 之 冒泡排序 简单选择排序 直接插入排序 希尔排序

排序的基本概念 假设含有n个记录的序列为{r1,r2,--,rn},其相应的关键字分别为{k1,k2,--,kn},需确定1,2,--,n的一种排序p1,p2,--,pn,使其相应的关键字满足kp1≤kp2≤--≤kpn非递减(或非递增)关系,即使得序列称为一个按关键字有序的序列{rp1,rp2,--,rpn},这样的操作就称为排序. 排序的稳定性 假设ki=kj(1≤i≤n,1≤j≤n,i≠j),且在排序前的序列中ri领先于rj(即i<j).如果排序后ri仍领先于rj,则称所用的排序方法是稳定

13. 蛤蟆的数据结构进阶十三排序实现之希尔排序法

13. 蛤蟆的数据结构进阶十三排序实现之希尔排序法 本篇名言:"一个人光溜溜的到这个世界来 ,最后光溜溜的离开这个世界而去 , 彻底想起来 , 名利都是身外物 ,只有尽一人的心力 , 使社会上的人多得他工作的裨益 ,是人生最愉快的事情.--邹韬奋" 下面是希尔排序法了. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47706135 1.  希尔排序 希尔排序(ShellSort)是插入排序的一种.也称缩小增量排序

SDUT 3403 数据结构实验之排序六:希尔排序

数据结构实验之排序六:希尔排序 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 我们已经学习了各种排序方法,知道在不同的情况下要选择不同的排序算法,以期达到最好的排序效率:对于待排序数据来说,若数据基本有序且记录较少时, 直接插入排序的效率是非常好的,希尔排序就是针对一组基本有序的少量数据记录进行排序的高效算法.你的任务是对于给定的数据进行希尔排序,其中增量dk=n/(2^k)(k=1,2

插入排序) 希尔排序 (最小增量排序)

/** * (插入排序) 希尔排序 (最小增量排序) * @author Cinn * */public class shellSort { /**     * @param args     */    public static void main(String[] args) {        // TODO Auto-generated method stub        int[] array= {48,58,50,98,69,51,27,99,100};        shlees

JavaScript 数据结构与算法之美 - 冒泡排序、插入排序、选择排序

1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习. 之所以把冒泡排序.选择排序.插入排序放在一起比较,是因为它们的平均时间复杂度都为 O(n2). 请大家带着问题:为什么插入排序比冒泡排序更受欢迎 ?来阅读下文. 2. 如何分析一个排序算法 复杂度分析是整个算法学习的精髓. 时间复杂度: 一个算法执行所耗费的时间. 空间复杂度:

数据结构和算法之排序六:希尔排序

经过前面五篇排序方法的介绍,我们了解到了递归思想以及分而治之的归并和快速排序,当然也涉及到了比较简单易懂的数据值传递冒泡,选择,以及插入排序.可以说每一种排序方式都各有千秋,都适合在不同的环境下进行使用,但是我们有时会不会思考一个问题,那就是我们在学习插入排序的时候的主题思想是将每一个数据取出来,然后和后边的前边的数据逐一进行比较,那么,我们是不是要进行N-1次的循环,或者说我们是不是要进行大约N的平方次比较,我们知道,在进行值的交换和比较是非常消耗时间的,那么是不是违背了我们算法的发展.有没有

数据结构和算法学习六,之非递归排序

http://blog.csdn.net/feixiaoxing/article/details/6844826 在上面一篇博客当中,我们发现普通查找和排序查找的性能差别很大.作为一个100万的数据,如果使用普通的查找方法,那么每一个数据查找平均下来就要几十万次,那么二分法的查找呢,20多次就可以搞定.这中间的差别是非常明显的.既然排序有这么好的效果,那么这篇博客中,我们就对排序算做一个总结. 按照我个人的理解,排序可以分为两种:一种是非递归排序,它主要按照非递归的方法对数据进行排序,也就是说主

数据结构与算法(C/C++版)【排序】

第八章<排序>  一.直接插入排序  //直接插入排序 //算法思想:每趟将一个待排的关键字按照其值的大小插入到已经排好的部分有序序列的适当位置上,直到所有待排关键字都被插入到有序序列中为止. //(1)时间复杂度分析: // ①最坏情况(整个序列逆序):O(n2) // ②最好情况(整个序列有序):O(n) // ③平均时间复杂度:O(n2) //(2)空间复杂度分析: // ①:O(1) void InsertSort(int R[], int n) //待排关键字存储在R[]中,默认为整

排序系列 之 希尔排序算法 —— Java实现

基本思想: 希尔排序的实质就是分组插入排序,又称缩小增量法. 将整个无序序列分割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序时,再对全体元素进行一次直接插入排序. 因为直接插入排序在元素基本有序的情况下,效率是很高的,因此希尔排序在时间效率上有很大提高. 实例: 无序序列:int a[] = {3,1,5,7,2,4,9,6}; 第一趟时: n=8; gap=n/2=4; 把整个序列共分成了4个子序列{3,