希尔排序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语言版

直接贴代码了

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

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

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

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

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

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

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

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

数据结构(c语言版)学习笔记——排序算法

数据结构(c语言版)排序算法笔记

归并排序(C语言版)

#include #include #include #include void mergeSort(int array[], int size); void _mergeSort(int ...

归并排序(C语言版)

归并排序利用了分治和递归的思想,将一个数组分成两部分,然后在分成两部分……知道两个数组只有一个值,然后在合并成一个数组。 看到了归并排序,忽然发现前段时间做的一个题,就是这个排序的一部分。 那道题...

基数排序(C语言版)

#include #include #include #include //0 1 2 ..... 9 #define RADIXCOUNT 10 #define RANDMAX 10000...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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