希尔排序c语言版

原创 2015年11月19日 12:31:09

以前学数据结构的时候,因为老师的时间问题,导致这个算法没讲,今天有人问我这个算法问题,然后下去查了一下资料,把这个算法终于弄明白了,这个算法就是将一个数组,
先确定一个步长,一般为数组大小的一半,然后将间距每个步长对应的两个数字,从头到尾的进行比较。因为我们是从小到大,那么就是如果前面的数如果比后面的数大就将他们两进行置换,每个数都进行同一步长的比较之后,接下来就缩小步长,将现在的步长缩小为原来步长的一半,然后在重复上述步骤,将每个步长间距的数进行比较置换,直到步长为0,算法排序完毕。
下面我们看一张图,可以更加清楚的明白希尔排序的原理希尔排序理解图
看到这个图,我们可以清楚的看到第一趟排序的结果,和第二趟排序的结果。
现在原理都弄懂了,可是要想转化问程序,可得下一番功夫。
下面是我借鉴一个人写的c语言代码,加上我自己的理解之后,写的代码,大家可以看一下。

#include <stdio.h>
void shell_sort(int arr[],int size)
{
 int step,j,front,temp;
 for(step=size/2;step>0;step=step/2)
 {
//从步长开始进行比较交换
  for(j=step;j<size;j++)
  {
   temp=arr[j];
   //将后一个步长后一个数的和对应进行比较如果后面的比前面的小
   for(front=j-step;front>=0&&temp<arr[front];front=front-step)
   {
    arr[front+step]=arr[front];
   }
   arr[front+step]=temp;
  }
 }
 for(step=0;step<size;step++)
 {
  printf("%d ",arr[step]);
 }
}
void main()
{
    int arr[] = {1,34,2,3,4,345,46,3,25};
    shell_sort(arr,9);
}

如果看不懂的,我下面进行解释一下:首先是最外面的循环,那是确定我们的步长,直到步长为0排序就算结束。
里面第一重循环就是在把每个确定步长的间距的两个数进行比较排序,此时就是从对应的后面的那个数往前进行比较置换,在从中间往后走的过程中,里面又套了一层循环,这个就是真正的要比较置换的程序了。看着代码和图我们就会慢慢明白了。

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

希尔排序(C语言版)

希尔排序实质上是一种分组插入方法。它的基本思想是:对于n个待排序的数列,取一个小于n的整数gap(gap被称为步长)将待排序元素分成若干个组子序列,所有距离为gap的倍数的记录放在同一个组中;然后,对...

排序算法总结及实现(C语言版)

#include using namespace std; void swap(int &a, int &b) { int temp; temp = a; a = b; b = temp;...

二叉排序树的插入、查找、删除、遍历(C语言版)

#include #include typedef struct treeNode { int data; struct treeNode *left; ...

数据结构与算法(C语言版)__堆排序

算法:把未排序的数据一个一个放入堆里,然后再一个一个的取出来。我们今天使用上一个博客写的大顶堆MaxHeap.h//MaxHeap.h #ifndef _MAX_HEAP_ #define _MAX_...

归并排序C语言版

直接贴代码了

常见排序算法(C语言版)

简单排序算法: 一些常见的排序算法实现O(∩_∩)O~ 插入排序:直接插入排序:最简单的排序方式,将一个数据插入到已经排好序的有序表中,得到一个新的,记录数增一的有序表。 折半插入排序:由于插入排序...

带头节点链表之插入排序(C语言版)

主要是对插入排序进行复习,先写一个数组的插入排序。#include void traverse(int *arr, int len); void insert_sort(int *arr, int l...
  • TigRer
  • TigRer
  • 2017年11月13日 20:41
  • 30

数据结构与算法(C语言版)__插入排序

低级排序算法:冒泡排序,选择排序,插入排序 高级排序算法:归并排序,堆排序,快速排序 插入排序就是在已经排序的数据中从大往小比较,出现比该数小的就插入到该位置后面。#include using n...

数据结构C语言版之排序(各种排序)

//排序: /* 1、录入学生基本信息 2、直接插入排序 3、冒泡排序 4、快速排序 5、简单选择排序 6、堆排序 7、2-路归并排序 8、输出学生信息 */ #includ...

排序算法总结 (C语言版)

一 理论 1、稳定排序和非稳定排序 简单地说就是所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,我们就说这种排序方法是稳定的。反之,就是非稳定的。  比如:一组数排序前是a1,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:希尔排序c语言版
举报原因:
原因补充:

(最多只允许输入30个字)