发布于  更新于 

算法知识汇总:排序算法

这篇文章简单汇总了针对数组的常见的排序算法,可能和程序设计/数据结构课程上的版本有所不同,仅供参考。

排序算法汇总

准备工作

随机数组生成

1
2
3
4
5
6
int* genArr(int len, int range){
// 记得用完要把它 free 掉:
int* arr = (int*)malloc(sizeof(int) * len);
for(int i = 0; i < len; i++) arr[i] = rand() % range;
return arr;
}

打印数组内容

1
2
3
4
void printArr(int* arr, int len){
for(int i = 0; i < len; i++) cout<<arr[i]<<" ";
cout<<endl;
}

int 值对换

1
2
3
4
5
void swap(int* a, int* b){
int tmp = *a;
*a = *b;
*b = tmp;
}

排序算法

冒泡排序

1
2
3
4
5
6
void bubbleSort(int* arr, int len){
for(int i = 0; i < len; i++)
for(int j = i; j < len; j++)
if(arr[i] > arr[j])
swap(&arr[i], &arr[j]);
}

插入排序

1
2
3
4
5
6
7
8
9
void insertSort(int* arr, int len){
for(int i = 1; i < len; i++){
int cur = arr[i], j = i - 1;
while(j >= 0 && arr[j] > cur)
// Attention that arr[j + 1] = arr[j--] is wrong.
arr[j-- + 1] = arr[j];
arr[j + 1] = cur;
}
}

Shell 排序:略微优化的插入排序

1
2
3
4
5
6
7
8
9
10
11
12
13
void shellSort(int* arr, int len){
for(int gap = len >> 1; gap > 0; gap >>= 1){
for(int i = gap; i < len; i += gap){
int cur = arr[i];
int j = i - gap;
while(j >= 0 && arr[j] > cur){
arr[j + gap] = arr[j];
j -= gap;
}
arr[j + gap] = cur;
}
}
}

归并排序:需要两个预先排好且同序的数组

1
2
3
4
5
6
7
8
9
10
11
int* mergeSort(int* arr1, int len1, int* arr2, int len2){
int len = len1 + len2;
int* arr = (int*)malloc(sizeof(int) * len);
int pos1 = 0, pos = 0;
while(pos < len){
if(pos1 == len1) arr[pos++] = arr2[pos - pos1];
else if(pos - pos1 == len2) arr[pos++] = arr1[pos1++];
else arr[pos++] = arr1[pos1] > arr2[pos - pos1] ? arr2[pos - pos1] : arr1[pos1++];
}
return arr;
}

快速排序

1
2
3
4
5
6
7
8
9
10
11
12
void qSort(int* arr, int l, int r){
if(l >= r) return;
int i = l, j = r;
while(i < j){
while(i < j && arr[j] >= arr[l]) j--;
while(i < j && arr[i] <= arr[l]) i++;
if(i < j) swap(&arr[i], &arr[j]);
}
swap(&arr[l], &arr[i]);
qSort(arr, l, i - 1);
qSort(arr, i + 1, r);
}