初等排序_学习笔记
插入排序
- 将开头元素视作已排序;
- 执行下述处理,直至未排序不部分消失;
- 取出未排序部分的开头元素赋给变量v;
- 在已排序部分,将所有比v大的元素向后移动一个单位;
- 将已取出的元素v插入空位。
void insertSort(int A[], int len) {
int i, j, v;
for (i=1; i<len; i++) {
v = A[i];
j = i-1;
while (j>=0 && A[j]>v) {
A[j+1] = A[j];
--j;
}
A[j+1] = v;
}
}
冒泡排序
- 重复执行下述操作,直至数组中不包括顺序相反的相邻元素;
- 从数组末尾开始依此比较相邻两个元素,如果大小关系相反则交换位置;
void bubbleSort(int A[], int N) {
bool flag = 1;
for (int i=0; flag; i++) {
flag = 0;
for (int j=N-1; j>=i+1; j--) {
// 这里如果换成<=,将会破坏算法稳定性;
if (A[j]<A[j-1]) {
// 交换前后顺序
swap(A[j], A[j-1]);
flag = 1;
}
}
}
}
选择排序
- 重复执行N-1次下述操作:
- 找出未排序部分最小值的位置minj;
- 将minj位置的元素与未排序部分的起始元素交换。
void selectSort(int A[], int N) {
int i, j, t, minj;
for (i=0; i<N-1; i++) {
minj = i;
// 选择未排序中的最小值的位置minj
for (j=i; j<N; j++) {
if (A[j]<A[minj]) minj = j;
}
// 交换A[i]和A[minj]
t = A[i]; A[i] = A[minj]; A[minj] = t;
}
}
初等排序方法总结
- 冒泡排序和选择排序不依赖于数据,即算法复杂度不受输入数据的影响;
- 插入排序算法时间复杂度依赖与数据,处理某些数据时具有很高的效率;