快速排序
void q_sort_1(int a[], int l, int r){
if(l >= r) return;
int x = a[l], i = l - 1, j = r + 1;// do..while()留出空余
while(i < j){//穿过
do i++; while(a[i] < x);//等于也停下
do j--; while(a[j] > x);
if(i < j) swap(a[i], a[j]);
}
q_sort_1(a, l, j), q_sort_1(a, j + 1, r);
}
void q_sort_2(int a[], int l, int r){
if(l >= r) return;
int i = l - 1, j = r + 1, x = a[l + r >> 1];
while(i < j){
do i++; while(a[i] < x);
do j--; while(a[j] > x);
if (i < j) swap(a[i], a[j]);
}
q_sort_2(a, l, j), q_sort_2(a, j + 1, r);
}
详见笔记
归并排序
void merge_sort(int a[], int l, int r){
if(l >= r) return;//易忘
int mid = l + r >> 1;
merge_sort(a, l, mid), merge_sort(a, mid + 1, r);
int i = l, j = mid + 1, k = 0;
while(i <= mid && j <= r){
if(a[i] <= a[j]) temp[k++] = a[i++];
else temp[k++] = a[j++];
}
while(i <= mid) temp[k++] = a[i++];
while(j <= r) temp[k++] = a[j++];
for(int i = l, k = 0; i <= r; i++, k++){
a[i] = temp[k];
}
}