蛮力法——排序问题
蛮力法就是暴力法,指基于问题所描述的内容直接建立算法求解。
问题:给定一个可排序的n个元素序列(数字、字符 或字符串),对它们按照非降序方式重新排列。
扫描排序
扫描排序的基本思想:
- 从左到右遍历序列
- 找到最小的数字,和序列的首个位置交换,然后将序列的首个位置移出序列
- 重复直到完成排序
代码实现:
//用选择法对给定数组排序
//输入:一个可排序数组A[0..n-1]
//输出:升序排序的数组A[0..n-1]
void selectSort(int *a,int n){
for(int i = 0;i < n-1;i++){
int min = 0x3f3f3f;
int min_pos = -1;
for(int j = i;j < n;j++){
if(a[j]<min){
min = a[j];
min_pos = j;
}
}
swap(a[i],a[min_pos]);
}
}
复杂度分析:
输入规模:序列元素个数n
基本操作:比较次数a[j] < min
影响基本操作执行次数的因素:n,只依赖输入规模
非递归,累加求和的时间复杂度为O(n2)
冒泡排序
冒泡排序的基本思想:
- 选定序列首个位置的元素作为本次排序的对象
- 依次和该对象所在位置后面的元素做比较,若比其大则取代其位置(换位置),若比其小,则其作为新的本次排序的对象
- 直到序列最后一个位置的元素也被比较了,结束此次排序,将最后一个元素移出序列
- 重复123至序列长度为1
代码实现:
//用冒泡法对给定数组排序
//输入:一个可排序数组A[0..n-1]
//输出:升序排序的数组A[0..n-1]
void bubbleSort(int *a,int n){
while(n--)
for(int i = 0;i < n;i++)
if(a[i]>a[i+1])
swap(a[i],a[i+1]);
}
复杂度分析:
输入规模:序列元素个数n
基本操作:比较次数a[i]>a[i+1]
影响基本操作执行次数的因素:n,只依赖于输入规模
非递归,累加求和的时间复杂度为O(n2)