您的位置:首页 > 其它

插入排序的三种方法

2017-06-19 21:37 447 查看
一、直接插入排序 

1、平均时间复杂度为O(n^2) 

2、最好情况为O(n) 

3、最坏情况下为O(n^2) 

4、空间复杂度为O(1)

算法实现为:
/*
*直接插入排序
*/

#include<stdio.h>

#define MaxSize 100

/*
*a为待排序的数组,length为数组长度
*/
void inSort(int a[] , int length) ;

/*
*进行数组元素的输出
*/
void displayArray(int a[] , int length) ;

void main()
{
int a[MaxSize] , length , i ;
printf("Please input the length of the array : \n") ;
scanf("%d" , &length) ;

//进行数组元素的接收
for(i = 0 ; i < length ; i++)
{
scanf("%d" , &a[i]) ;
}

printf("Before sort... \n") ;
displayArray(a , length) ;

inSort(a , length) ;

printf("After sort... \n") ;
displayArray(a , length) ;
}

void inSort(int a[] , int length)
{
//临时储存元素
int temp ;
int i , j ;
for(i = 1 ; i < length ; i++)
{
temp = a[i] ;
j = i - 1 ;
while(temp < a[j] && j >= 0)
{
a[j + 1] = a[j] ;
j-- ;
}
a[j + 1] = temp ;
}
}

void displayArray(int a[] , int length)
{
int i ;
for(i = 0 ; i < length ; i++)
{
printf("%4d ", a[i]);
}
printf("\n") ;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66

二、折半插入排序 

1、平均时间复杂度为O(n^2) 

2、最好情况为O(nlogn) 

3、最坏情况下为O(n^2) 

4、空间复杂度为O(1)

算法实现为:
/*
*折半插入排序
*/

#include<stdio.h>

#define MaxSize 100

/*
*a为待排序的数组,length为数组长度
*/
void binSort(int a[] , int length) ;

/*
*进行数组元素的输出
*/
void displayArray(int a[] , int length) ;

void main()
{
int a[MaxSize] , length , i ;
printf("Please input the length of the array : \n") ;
scanf("%d" , &length) ;

//进行数组元素的接收
for(i = 0 ; i < length ; i++)
{
scanf("%d" , &a[i]) ;
}

printf("Before sort... \n") ;
displayArray(a , length) ;

binSort(a , length) ;

printf("After sort... \n") ;
displayArray(a , length) ;
}

void binSort(int a[] , int length)
{
int i , j , mid , low , high , temp ;
for(i = 1 ; i < length ; i ++)
{
low = 0 ;
high = i - 1 ;
temp = a[i];
while(low <= high)
{
mid = (low + high) / 2 ;
if(temp < a[mid])
{
high = mid - 1 ;
}else{
low = mid + 1 ;
}
}
for(j = i - 1 ; j >= low ; j--)
{
a[j + 1] = a[j] ;
}
a[low] = temp ;
}
}

void displayArray(int a[] , int length)
{
int i ;
for(i = 0 ; i < length ; i++)
{
printf("%4d ", a[i]);
}
printf("\n") ;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74

三、希尔排序 

1、平均时间复杂度为O(n^1.5) 

4、空间复杂度为O(1)

算法实现为:
/*
*希尔排序
*/

#include<stdio.h>

#define MaxSize 100

/*
*进行希尔排序
*a为待排序数组,lengh为数组长度,delta为增量数组,length1为增量数组的长度
*/
void shellSort(int a[] , int lengh , int delta[] , int length1) ;

/*
*进行一趟希尔排序
*/
void shellInsert(int a[] , int length , int delta) ;

/*
*进行数组的输出
*/
void displayArray(int a[] , int length) ;

void main()
{
int a[MaxSize] , length , i ;
int delta[MaxSize] , length1 ;

printf("Please input the length of the array : ") ;
scanf("%d" , &length) ;

//进行数组元素的接收
for(i = 0 ; i < length ; i++)
{
scanf("%d" , &a[i]) ;
}

//进行增量数组的接收
printf("Please input the delta's length : ") ;
scanf("%d" , &length1) ;

//进行数组元素的接收
for(i = 0 ; i < length1 ; i++)
{
scanf("%d" , &delta[i]) ;
}

printf("Before sort... \n") ;
displayArray(a , length) ;

shellSort(a , length , delta , length1) ;

printf("After sort... \n") ;
displayArray(a , length) ;
}

void shellSort(int a[] , int length , int delta[] , int length1)
{
int i ;
for(i = length1 - 1 ; i >= 0 ; i--)
{
shellInsert(a , length , delta[i]) ;
}
}

void shellInsert(int a[] , int length , int delta)
{
int i , j , temp ;
for(i = delta ; i < length ; i++)
{
temp = a[i] ;
j = i - delta ;
while(temp < a[j] && j >= 0)
{
a[j + delta] = a[j] ;
j -= delta ;
}
a[j + delta] = temp ;
}
}

void displayArray(int a[] , int length)
{
int i ;
for(i = 0 ; i < length ; i++)
{
printf("%4d ", a[i]);
}
printf("\n") ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: