快速排序
int partition(vector<int>& arr,int left,int right)
{
int tmp=arr[left];
while(left<right)
{
//先从右面开始
while(left< right&&arr[right]>=tmp)
{
right--;
}
arr[left]=arr[right] ;
//此时arr[right]<tmp;
while(left<right && arr[left]<=tmp)
{
left++;
}
//此时arr[left]>=tmp
arr[right]=arr[left];
}
arr[left]=tmp;
return left;// 此时left和right相等
}
void QuickSort(vector<int>&arr,int left,int right)
{
int shaft=partition(arr,left,right);
if(shaft-1>left)
{
QuickSort(arr,left,shaft-1);
}
if(shaft+1<right)
{
QuickSort(arr,shaft+1,right);
}
}
vector<int> MySort(vector<int>& arr) {
// write code here
int left=0;
int right=arr.size()-1;
QuickSort(arr, left, right);
return arr;
}
插入排序
vector<int> MySort(vector<int>& arr) {
// write code here
//插入排序:思想是一次遍历,但是每次使已扫描部分排好序
//分别用i,j来完成
int tmp;
int len=arr.size();
for(int i=1;i<len;i++)
{
tmp=arr[i];
int j=i-1;
while(j>=0 && arr[j] >tmp)
{
arr[j+1]=arr[j];
j--;
}
//此时arr[j0<arr[i]]
arr[j+1]=tmp;
}
return arr;
}
希尔排序
希尔排序和选择排序类似
vector<int> MySort(vector<int>& arr) {
// write code here
//希尔排序
int len=arr.size();
for(int gap=len/2;gap>0;gap/=2)
{
for(int i=gap;i<len;i++)
{
int tmp=arr[i];
int j=i-gap;
while(j>=0 && arr[j]>tmp )
{
arr[j+gap]=arr[j];
j-=gap;
}
arr[j+gap]=tmp;
}
}
return arr;
选择排序
思路:
1.在未排序的情况下找到最小元素,放到排序的后面。
2.找到最小元素,如果不是未排序的首元素,则进行交换。
二路归并排序
思路:
1.每两两一组归并,排序
void Sort(vector<int>&arr,int gap)
{
vector<int> assist(arr.size(),0);
int index=0;
int start1=0;
int end1=start1+gap-1;
int start2=end1+1;
int end2=start2+gap-1>arr.size()-1?arr.size()-1:start2+gap-1;
while(start2<arr.size()) //保证有两路,也就是有第二组的存在;
{
while(start1<=end1 && start2<=end2)
{
if(arr[start1]<arr[start2])
{
assist[index++]=arr[start1++];
}
else
{
assist[index++]=arr[start2++];
}
}
//
while(start1<=end1)
{
assist[index++]=arr[start1++];
}
while(start2<=end2)
{
assist[index++]=arr[start2++];
}
//更新
start1=end2+1;
end1=start1+gap-1;
start2=end1+1;
end2=start2+gap-1>arr.size()-1?arr.size()-1:start2+gap-1;
}
while(start1<arr.size()) //只有第一组
{
assist[index++]=arr[start1++];
}
for(int i=0;i<arr.size();i++) //往回复制回去
{
arr[i]=assist[i];
}
}
vector<int> MySort(vector<int>& arr) {
// write code here
//二路归并
for(int gap=1;gap<arr.size();gap*=2)
{
Sort(arr,gap);
}
return arr;
}
};