排序算法
在日常生产生活中,将杂乱的一组数据转换成有顺序的另一组数据所使用的算法叫做排序算法.那么最基础的排序算法都有哪些?
0.冒泡排序
主要思想:循环比较相邻数据并交换符合一定条件(升序则为靠前数据大于靠后数据)的数据,第i次循环都会使第i小或第i大的数据交换到正确的位置.
伪代码
for i=1 to a.length-1:
for j=a.length to i+1:
if a[j]<a[j-1]
exchange a[j],a[j-1]
exit;
exit;
1.选择排序
主要思想:循环寻找未排序序列中最小(大)元素并将其放置正确的位置.
伪代码:
for i=1 to a.length
for j=i+1 to a.length
if a[i]>a[j]
exchange a[i],a[j]
exit;
exit;
2.插入排序
主要思想:循环将未排序的元素插入到已排好序的序列中.
伪代码:
for i=2 to a.length
for j=1 to i-1
if a[i]<a[j]
exchange a[i],a[j]
exit;
exit;
3.希尔排序
主要思想:改进的插入排序,由于每次插入排序需要比较的次数太多,可以考虑先生成h间隔的有序数组,h的值递减至1时,数组排序完成.
例如数组:
H E L L O W R O L D H E L L O P R O G R A M
设数组个数为L,一般h的初值设置条件为h<L且h=(1,4,13,…)中的最大值,比较科学,例如该数组个数为22,那么h的初值为13
那么每次h的值递减,得到的结果依次为:
13-sort:H E L L O G R A L D H E L L O P R O W R O M
4-sort:H D H A L E L E L G O L O L R P O M W R R O
1-sort:A D E E G H H L L L L L M O O O O P R R R W
伪代码:
h=1,N=a.length
while(h<N/3)
h=3*h+1
while(h>=1)
for i=h to N
for(j=i;j>=h&&a[j]<a[j-h];j-=h)
exchange(a[j],a[j-h])
exit
h=h/3
exit
exit
算法复杂度分析
排序算法 | 时间复杂度 |
---|---|
冒泡算法 | O(n2) O ( n 2 ) |
选择排序 | O(n2) O ( n 2 ) |
插入排序 | O(n2) O ( n 2 ) |
希尔排序 | 根据h的值复杂度不同,不好确定,但一般会比 O(n2) O ( n 2 ) 小 |