我们通常所说的排序算法往往指的是内部排序算法,即数据记录在内存中进行排序。
排序算法大体可分为两种:
一种是比较排序,时间复杂度O(nlogn) ~ O(n^2),主要有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序等。
另一种是非比较排序,时间复杂度可以达到O(n),主要有:计数排序,基数排序,桶排序等。
下表给出了常见比较排序算法的性能:
为了便于以下描述,接下来全部算法的排序对象均为乱序数组int a[n];
-
冒泡排序(BubbleSort)
思路:对相邻的两个元素进行比较,这样每轮比较完当前最大(小)的元素就会移到尾部,如此重复n轮,便可实现排序。
实现:
1 void bubbleSort(int a[],int begin,int end) 2 { 3 for(int i = begin;i<end;i++) 4 { 5 for(int j = i+1;j<end;j++) 6 { 7 if(a[i]>a[j]) 8 { 9 std::swap(a[i],a[j]); 10 } 11 } 12 } 13 }
具体排序过程如图:
总结:
最简单排序算法,稳定,由于两层循环因此复杂度为O(n2)。(但是想到当年第一次找工作时被问到,结果不出所料没有答出来,真是让我觉得难堪的算法。)