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



