冒泡排序和选择排序
- 冒泡排序的本质就是交换,选择排序的本质就是求最大最小,
|
|
插入排序(挪动数组)
|
|
快速排序(分治法的一个体现)
- 快排之单向扫描分区法
|
|
- 双向扫描法
|
|
- 三指针分区法
|
|
- 3.6 快排在工程实践中的优化
希尔排序
希尔排序的过程
- 希尔排序在排序前:将一个序列分成了好几个序列
- 在第一趟排序时:将这几个序列做插入排序。
- 在第二趟排序时:将这个序列又分了好几个序列做插入排序。
- …………….
- 在第n趟排序时:将原序列进行插入排序,从宏观上看,此序列就基本是有序的了。这时就用简单插入排序将数列直至已序
从直观上看希尔排序:
就是把数列进行分组(不停使用插入排序),直至从宏观上看起来有序,最后插入排序起来就容易了(无须多次移位或交换)。就是increase后面的第一个分组中的元素和数列的第一个分组比较,然后后面第二个分组和数列的第二个分组比较....
|
|
归并排序
#include<bits/stdc++.h>
using namespace std;
//归并过程
void merge(int arr[], int l, int mid, int r){
int help[r-l+1];//辅助数组
int i = 0;
int lIndex = l;
int rIndex = mid+1;
while(lIndex <= mid && rIndex <= r){
help[i++] = arr[lIndex] < arr[rIndex] ? arr[lIndex++]:arr[rIndex++];
}
//左边和右边肯定有一边到头了,不可能同时,因为每次只移动一边
while(lIndex <= mid){
help[i++] = arr[lIndex++];
}
while(rIndex <= r){
help[i++] = arr[rIndex++];
}
//将排好序的辅助数组赋值给原始数组,不需要返回值
for(i = 0; i < r-l+1; i++){
arr[l+i] = help[i];
}
}
//递归
static void mergeSort(int arr[], int l, int r){
if(l == r){
return;
}
int mid = (l + r) / 2;
//左半部分归并排序
mergeSort(arr, l, mid);
//右半部分归并排序
mergeSort(arr, mid+1, r);
//左右部分归并
merge(arr, l, mid, r);
}
//归并排序整个数组
void mergeSort(int arr[], int n){
//如果数组为空或只有一个元素,不需要排序
if(arr == NULL || n < 2){
return;
}
mergeSort(arr,0,n-1);
}
int main(){
int n;
while(cin >> n){
int arr[n];
for(int i = 0; i < n; i++) cin >> arr[i];
mergeSort(arr, n);
for(int i = 0; i < n; i++){
cout << arr[i] << " ";
}
cout << endl;
}
return 0;
}
堆排序
|
|
sort函数的时间复杂度为 O(N log(N))
这篇将排序将的很好
https://www.imooc.com/article/9429