希尔排序

来源:互联网 发布:plsql 加载sql文件乱码 编辑:程序博客网 时间:2024/04/29 10:09

1, 希尔排序是一种O(N^1.25)(公认的,没有数学证明),好于O(N*N)。

2, 希尔排序可以说就是插入排序的增量模式,最小增量必须有1。也可以理解为对数列的多次分组插入排序。分组间隔为1的情况,就是插入排序。所以希尔排序的分组间隔的选择关系到排序算法的优劣。

3, 希尔排序是一种不稳定的排序算法。

 

#include "stdafx.h"
#include "stdio.h"

void InsertSort(int* data, int length, int step)
{
 for( int i = step; i < length; i++ )
 {
  int temp = *(data+i);
  for( int j = i; j > 0; j -= step )
  {
   if( *(data+j-step) > temp )
    *(data+j) = *(data+j-step);
   else
    break;
  }
  *(data+j) = temp;
 }
}

//void ShellSort(int A[], int count)
//{
// int i, j, increment;
// int temp;
//
// for( increment = count / 2; increment > 0; increment /= 2 )
// {
//  for( i = increment; i < count; i++ )
//  {
//   temp = A[i];
//   for( j = i; j >= increment; j -= increment )
//   {
//    if( A[j-increment] > temp )
//     A[j] = A[j-increment];
//    else
//     break;
//   }
//   A[j] = temp;
//  }
// }
//}

void ShellSort(int A[], int count)
{
 int i, j, increment;
 int temp;

 for( increment = count / 2; increment > 0; increment /= 2 )
 {
  InsertSort(A, count, increment);
 }
}

int _tmain(int argc, _TCHAR* argv[])
{
 int A[] = {34, 8, 64, 51, 32, 21};
 int count = sizeof(A) / sizeof(A[0]);

 //for( int i = 1; i < count; i++ )
 //{
 // int temp = A[i];
 // for( int j = i; j > 0; j-- )
 // {
 //  if( temp < A[j-1] )
 //   A[j] = A[j-1];
 //  else
 //   break;
 // }
 // A[j] = temp;
 //}

 //InsertSort(A, count, 1);

 ShellSort(A, count);

 for( int i = 0; i < count; i++ )
  printf("%d  ", A[i]);

 return 0;
}

原创粉丝点击