插入排序——直接插入排序和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)
稳定性:不稳定
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)
稳定性:不稳定
相关文章推荐
- 排序:插入排序(直接插入排序、Shell排序)
- 排序算法--插入排序(直接插入排序、折半插入、shell排序)的java实现
- 插入排序之直接插入排序和Shell排序
- 直接插入排序和shell排序
- 直接插入排序、折半插入排序、Shell排序、冒泡排序,选择排序
- 直接插入排序、二分法插入排序、表插入排序、Shell排序
- C语言实现基本排序算法----排序(直接插入排序,SHELL排序,冒泡排序,快速排序,简单选择排序,堆排序)
- c++实现数据结构中的各种排序方法:直接插入、选择,归并、冒泡、快速、堆排序、shell排序
- C语言程序----排序(直接插入排序,SHELL排序,冒泡排序,快速排序,简单选择排序,堆排序)
- 内排序(1)插入排序:直接插入和shell排序
- 面试利器(二)-------插入排序(直接插入排序和希尔排序(Shell排序))
- 插入排序:直接插入排序 二分法插入排序 表插入排序 Shell排序
- 算法实现之直接插入排序与shell排序
- 数据结构->直接插入排序
- 笔试之排序-直接插入排序、冒泡排序、快速排序
- 2015-12-7 项目1—(2)直接插入排序
- C语言实现 排序源程序(包括直接插入、希尔、冒泡、快速、简单选择、堆排序)
- 直接插入排序的Java实现、性能分析以及适用场景
- 直接插入排序
- 直接插入排序