快速排序
void quick_sort(int a[], int l, int h){
if(l >= h)
return;
int i = l, j = h;
int tmp = a[l];
while(i < j){
while(i < j && a[j] >= tmp) // 若和以下写a[j] > tmp和a[i] < tmp,则错
j--;
a[i] = a[j];
while(i < j && a[i] <= tmp)
i++;
a[j] = a[i];
}
a[i] = tmp;
quick_sort(a, l, i - 1);
quick_sort(a, i + 1, h);
}
冒泡排序
void bubble_sort(int a[], int n){
for(int i = 1; i <= n - 1; i++){ // n - 1趟
bool swap = false;
for(int j = 0; j < n - i; j++){ // 对于第i趟,冒出最大元素到第n + 1 - i个位置
if(a[j] > a[j + 1]){
int tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
swap = true;
}
}
if(!swap) // 此趟未交换元素,则已排序好,返回
return;
}
}
选择排序
void swap(int &a, int &b){
int tmp = a;
a = b;
b = tmp;
}
void select_sort(int a[], int n){
for(int i = 0; i < n - 1; i++){ // n - 1趟
int k = i;
for(int j = i + 1; j < n; j++){ // 对于第i趟,计算出最小元素下标
if(a[j] < a[k])
k = j;
}
swap(a[i], a[k]);
}
}
插入排序
void insert_sort(int a[], int n){
for(int i = 1; i < n; i++){ // n - 1趟
int tmp = a[i];
int j = i - 1;
while(j >= 0 && a[j] > tmp) //找到合适位置
j--;
int k = i - 1;
while(k > j){ // 移动元素
a[k + 1] = a[k];
k--;
}
// a[j + 1] = a[i]; // 错误,之前的a[i]已被覆盖
a[j + 1] = tmp; // 保存到合适位置
}
}