快速排序( O(N*logN) )
在时间复杂度同为ON*log(N)中效率较高的了。
基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
#include<bits/stdc++.h>
using namespace std;
//对于数组的传参,可以按照int arr[],也可以int *arr,这两种方法都是传入的地址,
//因此在函数中对数组的操作,会改变原有数组的值,
void quick_sort(int arr[],int begin,int end){
if ( begin<end) {
//挖走begin位置的数,这个位置的数会有别的数来填补
int i = begin, j = end, x = arr[begin];
//倒叙找到第一个小于x的数然后填入begin的坑
//这个时候j的位置就出现了一个新的坑,这个位置需要一个比基数大的数填
while (i < j && arr[j] >=x) j--;
if (i < j)arr[i++] = arr[j];
//从左到右找到第一个大于x的数,然后填补j位置的坑
while (i < j && arr[i] <= x)i++;
if (i < j)arr[j--] = arr[i];
arr[i] = x;
//分治,将i的左右两边再次快排
quick_sort(arr,begin,i-1);
quick_sort(arr,i+1,end);
}
}
int main() {
int arr[9] = {
1,1,34,5,7,8,9,0,11};
quick_sort(arr,0,8);
for (int i:arr) {
cout << i << endl;
}
return 0;
}
//结果:
//0
//1
//1
//5
//7
//8
//9
//11
//34
选择排序(O(N^2))
基本思想:
每次从未排序的序列中找打一个最小的数插入到已完成排序序列的最后一个
void SelectSort(int arr[],int lenght) {
int index = 0;
while (index!=lenght) {
int x = 1e9, temp = 0;
for (int i = index; i <lenght;i++) {
if (arr[i]<=x) {
temp = i;
x = arr[i];
}
}
swap(arr[index],arr[temp]);
index++;
}
}
归并排序(O(N*logN))
分治思想
图片演示
//归并排序
//分治,分到长度为2的最小单元,让这个单元有序,然后在从下往上开始有序
void Merge(vector<int> &arr ,int front,int mid,int end) {
//注意拷贝的区间。
vector<int> left(arr.begin()+front, arr.begin() + mid+1 );//拷贝左半部分
vector<int> right(arr.begin() + mid + 1,arr.begin()+end+1);//拷贝右半部分
//在尾部插入一个编译器允许的int类型最大值。
left.insert(left.end(),numeric_limits<int>::max());
right.insert(right.end(),numeric_limits<int>::max());
int leftindex = 0, rightindex = 0;
for (int i = front; i <= end;i++) {
if (left[leftindex] < right[rightindex])arr[i] = left[leftindex++];
else arr[i] = right[rightindex++];
}
}
//归并排序
void MergeSort(vector<int> &arr,int front,int end) {
if (front >= end) return;
int mid = (front + end) /2;
MergeSort(arr,front,mid);
MergeSort(arr,mid+1,end);
Merge(arr,front,mid,end);
}