您的位置:首页 > 运维架构 > Shell

插入排序——直接插入排序和shell排序

2018-03-27 20:54 204 查看
1. 排序的分类



2. 直接插入排序
(1)算法思想:
        直接插入排序是一种简单的排序算法,将第一个元素看作有序子序列,从第二个元素开始,和前一个元素比较,若小于,将前一个元素向后移,将第二个元素插入到有序子序列中;若大于,直接将第二个元素插入到有序子序列中。按这种过程继续下去,直到完成所有的有序子序列。



(2)基本实现:void InsertSort(DataType arr[], int sz)
{
int key = 0;
for (int i = 1; i < sz; i++)
{
key = arr[i];
int j = i - 1;
while (j>=0&&key<arr[j])
{
arr[j + 1] = arr[j];
j--;
}
arr[j+1] = key;
}
}
(3)算法性能:
      时间复杂度:  最坏情况下,即元素逆序时,为O (n^2);
                             最好情况下,即元素刚好是有序的,为O (n);
                            一般情况下,为O (n^2);
      空间复杂度:O (1);
      稳定性:稳定的;
3. 二分插入排序
(1)算法思想:当元素逆序时,利用直接插入思想排序时,元素之间的比较次数是(n (n+1) )/2;但是我们知道,在元素有序时,利用二分查找算法可以高效的找到元素的位置。那么,我们可以利用二分查找算法先找到要插入的元素的位置,这样可以减少元素之间的比较次数,提高算法的效率。
(2)基本实现:void BinInsertSort(DataType* arr, int sz)
{
for ( int i = 1; i < sz; i++)
{
int key = arr[i];
int left = 0;
int right = sz - 1;
while (left <= right)
{
int mid = left + ((right - left) >> 1);
if (arr[mid]>key)
right = mid - 1;
else
left = mid + 1;

}
for (int j = i - 1; j >= left; --j)
{
arr[j + 1] = arr[j];
}
arr[left] = key;
}

}(3)算法性能:
                         时间复杂度:O (n^2)
                         空间复杂度:O (1)
                         稳定性:稳定
4. shell 排序
(1)算法思想:
shell (希尔)排序是在直接插入排序上的改进。是先将整个待排序的序列按照一定的规则(或者利用gap=gap/3+1,或者指定增量序列increase)划分成若个子序列,对每个子序列进行直接插入排序,等到整个序列基本有序时,在对全体数据进行一次直接插入排序。



(2)基本实现:void ShellSort(DataType * arr, int sz)
{
int gap = 1;
while (gap < sz)
{
gap = gap * 2 + 1;

}
while (gap>0)
{
for (int i = gap; i < sz; i++)
{
int key = arr[i];
int j = i - gap;
while (j>=0 && key < arr[j])
{
arr[j + gap] = arr[j];
j = j - gap;
}
arr[j + gap] = key;
}
gap = gap / 3;
}
}
(3)算法性能:
                      时间复杂度:O(n^1.5)
                      空间复杂度:O (1)
                      稳定性:不稳定
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: