目录
插入排序:
希尔排序:
插入排序:
注意这里不要将插入排序和冒泡排序弄混:
插入排序是将数据不断放入前一个有序数列:
// 插入排序
void InsertSort(int* a, int n)
{for (int j =1; j < n; j++){for (int i = j; i > 0; i--){if (a[i] < a[i - 1]){int m = a[i - 1];a[i -1] = a[i];a[i] = m;}else{break;}}}
}
希尔排序:
将插入排序进行多次实现,从高间距到低间距,最后到间距为1的插入排序:
如图我们将具有相同标记的方格记为一组,并分别对不同组进行插入排序,这样就会将序列变得比原来有序,这样不断进行,并不断缩小排序的间距。
这样再次进行排序将会变的更加有序,直到间距为1。间距为1时进行排序将变为插入排序,序列将完全有序。
target为间距
// 希尔排序
void ShellSort(int* a, int n)
{int target=n/2;while (target){for (int m = 0; m < target; m++)//实现多组排序{for (int j = m; j < n ; j += target)//单组排序{for (int i = j; i > target-1; i -= target)//这里不能是i>0,i-target最小为0{if (a[i] < a[i - target]){int m = a[i - target];a[i - target] = a[i];a[i] = m;}else{break;}}}}target /= 2;}
}
当然这里我们进行三层循环有一些繁琐,这里我们可以改善成为两层循环:
也就是第一组进行一次插入排序,第二组进行一次插排序........不断前进
// 希尔排序
void _ShellSort(int* a, int n)
{int target = n / 2;while (target){for (int j = 0; j < n; j ++)//递进形式排序{for (int i = j; i > target - 1; i -= target)//这里不能是i>0,i-target最小为0{if (a[i] < a[i - target]){int m = a[i - target];a[i - target] = a[i];a[i] = m;}else{break;}}}target /= 2;}
}