1.冒泡排序
template <typename T>
void bubble(T *a, int n) {
for (int i = 0; i < n - 1; i++) {
bool flag = true;
for (int j = 0; j < n - i - 1; j++) {
if (a[j] > a[j+1]) {
flag = false;
swap(a[j], a[j+1]);
}
}
if (flag) {
break;
}
}
}
2.直接插入排序
初始记录的关键字: [7] 4 -2 19 13 6
第一趟排序: [4 7] -2 19 13 6
第二趟排序: [-2 4 7] 19 13 6
第三趟排序: [-2 4 7 19] 13 6
第四趟排序: [-2 4 7 13 19] 6
第五趟排序: [-2 4 6 7 13 19]
//插入
template <typename T>
void insert(T *a, int n) {
for (int i = 1; i < n; i++) {
int t = a[i]; //要插入的值
int j;
for (j = i; j > 0 && a[j - 1] > t; j--) {
a[j] = a[j - 1];
}
a[j] = t;
}
}
3.选择排序
每次从当前待排序的记录中选取关键字最小的记录表,然后与待排序的记录序列中的第一个记录进行交换,直到整个记录序列有序为止
初始记录的关键字: 7 4 -2 19 13 6
第一趟排序:-2 4 7 19 13 6
第二趟排序: -2 4 7 19 13 6
第三趟排序: -2 4 6 19 13 7
第四趟排序: -2 4 6 7 13 19
第五趟排序: -2 4 6 7 13 19
第六趟排序: -2 4 6 7 13 19
//选择
template <typename T>
void select(T *a, int n) {
for (int i = 0; i < n - 1; i ++) {
int k = i;//假设k是最小数的下标
for (int j = i + 1; j < n; j++) {
if (a[j] < a[k]) {
k = j;
}
}
if (k != i) {
swap(a[k], a[i]);
}
}
}
4.快速排序
//快速
template <typename T>
void qsort(T *a, int n) {
if (n <= 1) return;
int L = 0;
int R = n - 1;
//一次分组
while (L < R) {
while (L < R && a[L] <= a[R]) {
R --;
}
swap(a[L], a[R]);
while (L < R && a[L] <= a[R]) {
L++;
}
swap(a[L], a[R]);
}
//对左边再次进行分组
qsort(a, L);
//对右边再次进行分组
qsort(a + L + 1, n - L - 1);
}
template <typename T>
void qsort2(T *a, int n) {
if (n < 1) return;
int L = 0;
int R = n -1;
int M = a[L];
while (L < R) {
while (L < R && M <= a[R]) {
R --;
}
a[L] = a[R];
while (L < R && a[L] <= M) {
L ++;
}
a[R] = a[L];
}
a[L] = M;
//对左边进行分组
qsort2(a, L);
//对右边进行分组
qsort2(a + L + 1, n - L - 1);
}