1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。
-
排序思路:
-
1.希尔排序可以理解为插入排序的升级版, 先将待排序数组按照指定步长划分为几个小数组
-
2.利用插入排序对小数组进行排序, 然后将几个排序的小数组重新合并为原始数组
-
3.重复上述操作, 直到步长为1时,再利用插入排序排序即可
int main() { // 待排序数组 int nums[5] = {3, 1, 2, 0, 3}; // 计算待排序数组长度 int len = sizeof(nums) / sizeof(nums[0]); // 计算步长 int gap = len / 2; do{ // 从第一个元素开始依次取出所有用于比较元素 for (int i = gap; i < len; i++) { // 遍历取出前面元素进行比较 int j = i; while((j - gap) >= 0) { printf("%i > %i\n", nums[j - gap], nums[j]); // 如果前面一个元素大于当前元素,就交换位置 if(nums[j - gap] > nums[j]){ int temp = nums[j]; nums[j] = nums[j - gap]; nums[j - gap] = temp; }else{ break; } j--; } } // 每个小数组排序完成, 重新计算步长 gap = gap / 2; }while(gap >= 1); }