希尔排序原理代码以及和插入排序对比--每日一题

希尔排序
希尔排序是在插入排序上扩展引申来的一种间隔插入排序,通常我们采用N/=2为间隔,即间隔依次递减一半,当然也可以有其他间隔取值方法。
以10个数的排序为例:
先以10/2=5为间隔进行插入排序,即:1-6、2-7、3-8、4-9、5-10形成五组,每组组内按照插入排序法排好顺序;
接着以5/2=2为间隔进行插入排序,即:1-3-5-7-9、2-4-6-8-10形成两组,每组组内按照插入排序法排好顺序(以7-3-5-1-9为例,插入排序是从3开始依次将3、5、1、9这四个元素插入到合适的位置,即会经历3-7-5-1-9 --> 3-5-7-1-9 --> 1-3-5-7-9 --> 1-3-5-7-9这些步骤);
最后以2/1为间隔形成一组,完成排序。

直接插入排序和希尔排序比较

希尔排序 直接插入
N越大比较次数和移动次数相较直接插入越少 更适合于原始记录基本有序的集合
不稳定 稳定
O(n^s) 1 O(n^2)
不适用于链式存储结构 适用于链式存储结构

希尔排序代码

#include 
using namespace std;

void shellsort(int a[], int n) {
	int gap = n / 2;
	
	//以gap间隔分组
	while(1 <= gap) {
		//从第gap+1个元素开始依次在每个组内进行插入排序
		for(int i = gap; i < n; i ++) {
			int j;
			int temp = a[i];
			//插入排序法 
			for(j = i - gap; j >= 0 && temp < a[j]; j -= gap) {
				a[j + gap] = a[j]; 
			}
			a[j + gap] = temp;
		}
		gap /= 2;
	}
} 

void printarray(int a[], int n) {
	for(int i = 0; i < n; i++) {
		cout << a[i] << " "; 
	}
	cout << endl;
}

int main() {
	int a[] = {10,12,3,8};
	int n = sizeof(a) / sizeof(int);
	printarray(a, n);
	shellsort(a, n);
	printarray(a, n);
}

你可能感兴趣的:(C++,面试刷题)