快速排序递归方法,quickSort(vector<int> a,int l, int r),平均情况O(nlogn),最坏情况O(n2).不稳定.
void quickSort(vector<int>a,int l,int r)
{
if (l>=r) return;
int i=l,j=r,x=a[l];
while(i<j)
{
while(i<j && a[j]>x) j--;
if(i<j) a[i++]=a[j];
while(i<j && a[i]<x) i++;
if(i<j) a[j--]=a[i];
}
a[i]=x;
quickSort(a,l,i-1);
quickSort(a,i+1,r);
}
选择排序selectSort(int a[],int len),O(n2):
void selectSort(int a[], int len)
{
int minindex, temp;
for(int i = 0; i<len-1;i++)
{
minindex = i;
for(int j = i+1; j<len; j++)
{
if(a[j]<a[minindex])
minindex = j;
}
temp = a[i];
a[i] = a[minindex];
a[minindex] = temp;
}
插入排序O(n2)
void InsertionSort(int a[], int size)
{
int i; //有序区间的最后一个元素的位置,i+1就是无序区间最左边元素的位置
for(i = 0; i < size-1; ++i){
int tmp = a[i + 1]; //tmp是待插入到有序区间的元素,即无序区间最左边的元素
int j = i;
while(j >= 0 && tmp < a[j]){ //寻找插入的位置
a[j + 1] = a[j]; //比tmp大的元素都往后移动
--j;
}
a[j + 1] = tmp;
}
}
冒泡排序O(n2).稳定排序
void BubbleSort(int arr[], int n)
{
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
//归并排序
void mergeSort(vector<int>& a,int l,int r)
{
if(l>=r) return;
int mid=(l+r)/2;
mergeSort(a, l, mid);
mergeSort(a, mid+1, r);
//合并两个有序数组
vector<int> tmp(r-l+1);
int i=l,j=mid+1,k=0;
while(i<=mid && j<=r)
{
if(a[i]<=a[j])
tmp[k++]=a[i++];
else
{
tmp[k++]=a[j++];
ans =(ans+ mid-i+1)%1000000007;
}
}
while(i<=mid) tmp[k++]=a[i++];
while(j<=r) tmp[k++]=a[j++];
k=0;
for(int i=l;i<=r;i++)
{
a[i]=tmp[k++];
}
}