冒泡排序
冒泡排序的原理总的来说就是小的浮上来,大的沉底。
思路:如果$ai < a{i+1}$,则交换。
原理示意图:
冒泡排序的平均情况时间复杂度为$O(n^2)$。
代码如下:
1 | void Bubble_Sort(int a[],int length) { |
快速排序
快排的思路是:先选取一个基准,然后将比基准小的放在左边,将比基准大的放在右边,然后再分小区间,重复以上操作。
原理示意图:
快速排序的平均情况时间复杂度为$O(n\log_2 n)$。
代码:
1 | void Quick_Sort(int s[], int l, int r) { |
插入排序
首先回忆一下你是怎么玩牌的,每次摸到一张牌,都要把它插入到正确位置。
插入排序的原理一样,首先查找一下它的正确位置$a_i$,然后将$a_i$后数向后移动一位,将这个数插入进去。
原理示意图:
插入排序的平均情况时间复杂度是$O(n^2)$。
代码:
1 | void Insertion_Sort(int arr[],int length) { |
选择排序
选择排序原理:首先找出最小值,然后放在数列的最前面,如此反复。
原理示意图:
选择排序的平均情况时间复杂度为$O(n^2)$。
代码如下
1 | void Selection_Sort(int a[],int length){ |
桶排序
设一个数组为桶,数组的大小为待排序数列的最大值加1,桶号即为数列的每一个值,当出现这个数时,对应的桶就加1。
原理示意图:
桶排序的平均情况时间复杂度为$O(n)$,但空间复杂度为$O(n)$。
代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15void Bucket_Sort(int a[], int max, int length) {
int B[max+1]= {0};
int i,j,count=0;
for (i=0; i<length; i++) {
B[a[i]]+=1;
}
for(i=0; i<=max; i++) {
if (B[i]>0) {
for(j=0; j<B[i]; j++) {
a[count]=i;
count++;
}
}
}
}
终极の排序
不需要任何算法,直接一个函数搞定!
1 | sort(a+1,a+1+n) |
别忘了加这个头文件:1
还可以通过写一个函数来决定从大到小排还是从小到大排。