希尔排序:
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但是非稳定排序算法。
希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。
该方法的基本思想是:
先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。
因为直接插入排序在元素基本有序的情况下,直接插入排序效率是很高的,因此希尔排序在对数据量比较大时的时间效率上比直接插入排序好很多。
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
//插入排序
void insert_sort(int *arr, int n)
{
int st = arr[0];
for(int i = 1; i < n; i++)
{
int j = i;
int key = arr[i];
while(arr[j-1] > key && 0 < j)
{
arr[j] = arr[j-1];
j--;
}
arr[j] = key;
}
}
void shellsort(int *arr, int n);//shell排序
void show(int *, int);//显示序列
void arr_init(int *, int);//待排序序列初始化
int main(int argc, char *argv[])
{
srand(time(0));
int n;
printf("input n:");
scanf("%d", &n);
int arr[n];
arr_init(arr, n);
show(arr, n);
//insert_sort(arr, n);
shellsort(arr, n);
show(arr, n);
return 0;
}
void shellsort(int *arr, int n)
{
int i, j, inc, key;
for(inc = n/2; inc >0 ;inc /= 2)
{
for(i = inc; i < n; i++)
{
key = arr[i];
for(j = i; j >= inc && key < arr[j-inc]; j-= inc)
arr[j] = arr[j - inc];
arr[j] = key;
}
}
}
void arr_init(int *arr,int n)
{
for(int i = 0; i < n; i++)
{
arr[i] = rand()%100;
}
}
void show(int *arr, int n)
{
for(int i = 0; i < n; i++)
printf("%-3d ", arr[i]);
printf("\n");
}
运行结果;