相关资料在百度上获取。
每个排序法的定义都是由百度的定义摘抄下来。
作者仅是整理一遍重要的信息。具体相关可以直接上百度查询。
若是文字太小可以按住Ctrl + 滑轮上下移动,来进行缩放
1.插入排序:
其中包括:直接插入排序,二分插入排序(又称折半插入排序),链表插入排序,希尔排序(又称缩小增量排序)。
直接插入排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
voidinsertion_sort(intarray[],intfirst,intlast)
{
inti,j;
inttemp;
for
(i=first+1;i<last;i++)
{
temp=array[i];
j=i-1;
//与已排序的数逐一比较,大于temp时,该数移后
while
((j>=0)&&(array[j]>temp))
{
array[j+1]=array[j];
j--;
}
//存在大于temp的数
if
(j!=i-1)
{array[j+1]=temp;}
}
}
|
折半插入排序(二分插入排序)
即在插入法的基础上加入了二分法,从而提高了效率。执行折半插入排序的前提是文件记录必须按顺序存储。
希尔排序法 希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序。
各组内的排序通常采用直接插入法。由于开始时s的取值较大,每组内记录数较少,所以排序比较快。随着不断增大,每组内的记录数逐步增多,但由于已经按排好序,因此排序速度也比较快。
/*
希尔排序,个人理解:一共n个数据,分成m组数据,每组有n/m个数据。然后对每组进行排序,因为每组数据少,所以排序 快。然后是m-1,再次分组,每组n/(m-1)个数据,然后排序......
假如有16个数据,分成4组,每组4个数据,进行排序,然后4-1=3.
分成3组,每组5个元素(最后一组为6个元素),进行排序,3-1=2
分成2组,每组8个元素,进行排序
最后分成1组数据(即不分组)。改组16个元素,进行排序
因为一开始元素比较少,所以排序快。最后因为已经排序好(已经有一定的顺序),所以排序也快。
*/
算法复杂度
——————————————————————————————————————————————————————————————
2.选择排序:
———————————————————————————————————————————————————————————————
3.冒泡排序
-
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
-
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
-
针对所有的元素重复以上的步骤,除了最后一个。
-
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
算法稳定性
{
int
i, j, temp;
for
(j = 0; j < n - 1; j++)
for
(i = 0; i < n - 1 - j; i++)
{
if
(a[i] > a[i + 1])
{
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
}
}
}
————————————————————————————————————————————————————————————————
4.快速排序
————————————————————————————————————————————————————————————————
5.堆排序
特点
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
|
#include <stdio.h>
void
swap(
int
*a,
int
*b);
void
adjustHeap(
int
param1,
int
j,
int
inNums[]);
void
HeapSort(
int
nums,
int
inNums[]);
//大根堆进行调整
void
adjustHeap(
int
param1,
int
j,
int
inNums[])
{
int
temp=inNums[param1];
for
(
int
k=param1*2+1;k<j;k=k*2+1)
{
//如果右边值大于左边值,指向右边
if
(k+1<j && inNums[k]< inNums[k+1])
{
k++;
}
//如果子节点大于父节点,将子节点值赋给父节点,并以新的子节点作为父节点(不用进行交换)
if
(inNums[k]>temp)
{
inNums[param1]=inNums[k];
param1=k;
}
else
break
;
}
//put the value in the final position
inNums[param1]=temp;
}
//堆排序主要算法
void
HeapSort(
int
nums,
int
inNums[])
{
//1.构建大顶堆
for
(
int
i=nums/2-1;i>=0;i--)
{
//put the value in the final position
adjustHeap(i,nums,inNums);
}
//2.调整堆结构+交换堆顶元素与末尾元素
for
(
int
j=nums-1;j>0;j--)
{
//堆顶元素和末尾元素进行交换
int
temp=inNums[0];
inNums[0]=inNums[j];
inNums[j]=temp;
adjustHeap(0,j,inNums);
//重新对堆进行调整
}
}
int
main() {
int
data[] = {6,5,8,4,7,9,1,3,2};
int
len =
sizeof
(data) /
sizeof
(
int
);
HeapSort(len,data);
return
0;
}
|
————————————————————————————————————————————————————————————————
6.归并排序