<pre name="code" class="cpp">
//直接插入排序
#include <iostream>
using namespace std;
void insert_sort(int a[],int length)
{
for(int i=1;i<length;i++)
{
if(a[i]<a[i-1])
{
int x=a[i];
int j=i-1;
while(a[j]>x&&j>=0)
{
a[j+1]=a[j];
j--;
}
a[j+1]=x;
}
}
}
int main()
{
int a[9]={8,4,5,7,3,9,1,2,6};
insert_sort(a,9);
for(int i=0;i<9;i++)
cout<<a[i]<<" ";
return 0;
}
直接插入排序是稳定的
时间复杂度 最好O(n) 最差O(n^2) 平均O(n^2)
希尔排序
- 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
- 按增量序列个数k,对序列进行k 趟排序;
- 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
- void shellsort1(int a[], int n)
- {
- int i, j, gap;
- for (gap = n / 2; gap > 0; gap /= 2) //步长
- for (i = 0; i < gap; i++) //直接插入排序
- {
- for (j = i + gap; j < n; j += gap)
- if (a[j] < a[j - gap])
- {
- int temp = a[j];
- int k = j - gap;
- while (k >= 0 && a[k] > temp)
- {
- a[k + gap] = a[k];
- k -= gap;
- }
- a[k + gap] = temp;
- }
- }
- }
void shell_sort(int a[], int n)
{
int j, gap;
for (gap = n / 2; gap > 0; gap /= 2)
for (j = gap; j < n; j++)//从数组第gap个元素开始
if (a[j] < a[j - gap])//每个元素与自己组内的数据进行直接插入排序
{
int temp = a[j];
int k = j - gap;
while (k >= 0 && a[k] > temp)
{
a[k + gap] = a[k];
k -= gap;
}
a[k + gap] = temp;
}
}
int main()
{
int a[9]={8,4,5,7,3,9,1,2,6};
shell_sort(a,9);
for(int i=0;i<9;i++)
cout<<a[i]<<" ";
return 0;
}
希尔排序时间复杂度最好O(n) 最坏O(n^2)不稳定