直接插入排序
将每个关键词,按照顺序,依次插入到前面有序的序列中去。检索到第i个关键字,那么前面所有的关键字都是有序的,所以,把第i个关键字也在前面中按序插入即可。C++代码如下:
void simpleInsertSort(vector<int> &nums){
for(int i = 1 ; i < length ; i++){
int temp = nums[i];
for(int j = i - 1; j >= 0 && nums[j] > temp; j--){
nums[j+1] = nums[j];
}
nums[j+1] = temp;
}
}
折半插入排序
思想跟前面一样,都是将第i个关键字插入到前面有序的序列中,但是插入位置,前面是用的顺序查找,这里可以用二分搜索。
C++代码如下:
void binInsertSort(vector<int> &nums)
{
for (int i = 1; i < nums.size(); i++)
{
int temp = nums[i];
int left = 0 , right = i-1;
while(left <= right){
int mid = (left + right) / 2;
if(nums[i] >= nums[mid]) left = mid + 1;
else right = mid - 1;
}
for(int j = i-1; j >= left ;j--){
nums[j+1] = nums[j];
}
nums[left] = temp;
}
}
希尔排序
根据前面的直接插入来看,如果数据基本有序的话,那么效率是非常快的。所以,希尔排序的思想是,慢慢让序列变得有序。直到完全有序。如何慢慢让数组变得有序呢?答:我们用到一个变量d,作用是,将每隔d个元素单独当作一个数列进行简单插入排序。成倍的慢慢缩小d,值到d=0。C++代码如下:
void shellSort(vector<int> nums){
for(int d = nums.size() / 2; d >= 1; d/=2){
for(int m = 0 ;m < d; m++){
for(int i = m; i < nums.size() ;i+=d){
int temp = nums[i];
int j = i-d;
for(; j >= 0 && temp < nums[j]; j-=d){
nums[j+d] = nums[j];
}
nums[j+d] = temp;
}
}
}
}