目录
小总结
关于面试中排序算法常见的坑
工程上对排序的改进
各个排序的C++参考代码
1.选择排序
2.冒泡排序
3.插入排序
4.归并排序
5.快速排序
6.堆排序
时间复杂度 | 额外空间复杂度 | 稳定性 | |
选择排序 | O(N²) | O(1) | × |
冒泡排序 | O(N²) | O(1) | √ |
插入排序 | O(N²) | O(1) | √ |
归并排序 | O(N*logN) | O(N) | √ |
快速排序 | O(N*logN) | O(logN) | × |
堆排序 | O(N*logN) | O(1) | × |
void selection_sort(int* a, int num)
{
for (int i = 0; i < num - 1; ++i)
{
for (int j = i + 1; j < num; ++j)
{
if (a[i] > a[j])
{
a[i] = a[i] ^ a[j];
a[j] = a[i] ^ a[j];
a[i] = a[i] ^ a[j];
}
}
}
}
void bubble_sort(int* a, int num)
{
for (int i = 0; i < num - 1; ++i)
{
for (int j = 0; j < num - i - 1; ++j)
{
if (a[j] > a[j + 1])
{
std::swap(a[j], a[j + 1]);
}
}
}
}
void insertion_sort(int* a, int num)
{
for (int i = 1; i < num; ++i)
{
int key = a[i];
int j = i - 1;
while (j >= 0 && a[j] > key)
{
a[j + 1] = a[j];
j--;
}
a[j + 1] = key;
}
}
#include
#include
void merge(std::vector& arr, int L, int mid, int R);
void mergeSort(std::vector& arr, int L, int R)
{
if (L == R) {
return;
}
int mid = L + ((R - L) >> 1);
mergeSort(arr, L, mid);
mergeSort(arr, mid + 1, R);
merge(arr, L, mid, R);
}
void merge(std::vector& arr, int L, int mid, int R)
{
std::vector help(R - L + 1);
int n1 = L;
int n2 = mid + 1;
int i = 0;
while (n1 <= mid && n2 <= R)
{
help[i++] = arr[n1] < arr[n2] ? arr[n1++] : arr[n2++];
}
while (n1 <= mid)
{
help[i++] = arr[n1++];
}
while (n2 <= R)
{
help[i++] = arr[n2++];
}
for (i = L; i <= R; i++)
{
arr[i] = help[i - L];
}
}
int main() {
std::vector arr = { 12, 11, 13, 5, 6, 7,5,1,2,3,8,2,35,3 };
int n = (int)arr.size();
mergeSort(arr, 0, n - 1);
std::cout << "排序后的数组:";
for (int i = 0; i < n; i++) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
return 0;
}
int* partition(int* arr, int L, int R)
{
int less = L - 1;
int more = R;
int* a = new int[2];
while (L < more){
if (arr[L] < arr[R]){
std::swap(arr[++less], arr[L++]);
}
else if (arr[L] > arr[R]){
std::swap(arr[--more], arr[L]);
}
else{
L++;
}
}
std::swap(arr[more], arr[R]);
a[0] = less + 1;
a[1] = more;
return a;
}
void quickSort(int* arr, int L, int R)
{
if (L < R) {
std::swap(arr[rand() % (R - L + 1) + L], arr[R]);
int* a = partition(arr, L, R);
quickSort(arr, L, a[0] - 1);
quickSort(arr, a[1] + 1, R);
}
}
void heapify(int* arr, int index, int heapsize)
{
int left = index * 2 + 1;
int largest;
while (left < heapsize)
{
largest = left + 1 < heapsize && arr[left + 1] > arr[left] ? left + 1 : left;
largest = arr[largest] > arr[index] ? largest : index;
if (largest == index)
{
break;
}
std::swap(arr[largest], arr[index]);
index = largest;
left = index * 2 + 1;
}
}
void heapSort(int arr[], int size)
{
for (int i = size / 2 - 1; i >= 0; i--)
{
heapify(arr, i, size);
}
for (int i = size - 1; i >= 1; i--)
{
std::swap(arr[0], arr[i]);
heapify(arr, 0, i);
}
}
总结不易,请点赞收藏。(部分内容来源于左神数据机构与算法)。