一、插入排序
1、直接插入排序
从第一个元素开始,依次取出,比较取出的元素和其左边的所有元素,如果比左边所有元素大,则直接插入,否则依次将比该元素大的元素向后移动,然后插入即可。
例:原始数据:46 25 31 18 84 18 20 60
【46】 25 31 18 84 18 20 60
【25 46】 31 18 84 18 20 60
【25 31 46】 18 84 18 20 60
【18 25 31 46】 84 18 20 60
【18 25 31 46 84】 18 20 60
【18 18 25 31 46 84】 20 60
【18 18 20 25 31 46 84】 60
【18 18 20 25 31 46 60 84】
#include<stdio.h>
void InsertSort(int k[],int n) //n为元素个数
{
int temp;//temp暂时存储取出的值
for( int i = 0 ; i < n ; i++ )
{
if( k[i-1] > k[i] )
{
temp = k[i];
//将比第i个元素大的左边所有元素向后移,给此元素找位置
for( int j = i-1 ; k[j] > temp ; j-- )
{
k[j+1] = k[j];
}
//找到元素位置,插入
k[j+1] = temp;
}
}
}
int main()
{
int a[8]={
46, 25, 31, 18, 84, 18, 20, 60};
InsertSort(a,8);
printf("排序后的结果是:");
for( int i = 0 ; i < 8 ; i++ )
{
printf("%d\t",a[i]);
}
return 0;
}
时间复杂度: 最好复杂度:O(n);最坏复杂度:O(n2)
平均复杂度:O(n2) 稳定
2、希尔排序
用元素个数除以2或3求得间距d1,从第一个元素开始,每隔d1个间距的元素分为一组,将每组的元素排序,再将d1除以2或3求得间距d2,同上,直到间距变为1。
例:原始数据:46 25 31 18 84 18 20 60
d1=4排完序后 -------- 46 18 20 18 84 25 31 60
d2=2排完序后 -------- 20 18 31 18 46 25 84 60
d3=1排完序后 -------- 18 18 20 25 31 46 60 84
#include <stdio.h>
void InsertSort(int k[], int n)
{
int i, j, temp;
int d = n;
do
{
d = d/2;
for( i=d; i < n; i++ )
{
if( k[i-d] > k[i] )
{
temp = k[i];
for( j=i-d; k[j] > temp; j-=d )
{
k[j+d] = k[j];
}
k[j+d] = temp;
}
}
}while(d > 1);
}
int main()
{
int i, a[8] = {
46,25,31,18,84,18,20,60};
InsertSort(a, 8);
printf("排序后的结果是:");
for( i=0; i < 8; i++ )
{
printf("%d\t",</