快速排序第一种(i,j分别在数组两边) 复杂度:O (nlogn)
void quicksort(int *a,int left,int right)//快速排序
{
while(left>right)
{
return;
}
int i,j,t,pivot;
pivot=a[left];
i=left;
j=right;
while(i<j){
while(pivot<=a[j]&&i<j)
{
j--;
}
while(pivot>=a[i]&&i<j)
{
i++;
}
if(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
a[left]=a[i];
a[i]=pivot;
quicksort(a,left,i-1);
quicksort(a,i+1,right);
};
快速排序第二种(快慢指针)复杂度:O (nlogn)
void quicksort2(int *a,int left,int right)//快速排序
{
int i,j,t,pivot;
j=left-1;
i=j-1;
pivot=a[right-1];
while(left>right)
{
return;
}
while(j<right){
if(a[j]<=pivot)
{
i++;
t=a[i];
a[i]=a[j];
a[j]=t;
j++;
cout<<"+"<<endl;
}else if(a[j]>pivot)
{
j++;
cout<<"="<<endl;
}
}
cout<<i<<endl;
cout<<j<<endl;
cout<<a[right-1]<<endl;
quicksort2(a,left,i);
quicksort2(a, i+2, right);
};
冒泡排序—复杂度:O(n²)
void bubblesort(int *a,int n)
{
int i,j,t;
for(i=0;i<n-1;i++)//i到达n即可
{
for(j=0;j<n-1-i;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
插入排序—复杂度:O(n²)
void insertsort(int *a,int n)
{
int i,j,t;
for(i=0;i<n-1;i++)
{
for(j=i+1;j>0;j--)
{
if(a[j]<a[j-1])
{
t=a[j];
a[j]=a[j-1];
a[j-1]=t;
}
}
}
}
注:外表与冒泡相似但思路不同 有点像是种反过来的冒泡
选择排序—复杂度:O(n²)
void selectsort(int *a,int n)
{
int i,j,t;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
}
注:选择排序即选择最小的那个数
归并排序—复杂度:O(nlogn)
#define len 101
void merge(int *a,int left,int mid,int right)
{
int temp[len];
int p=0;
int i=left;
int j=mid+1;
while(i<=mid&&j<=right)//前后比较把小的排在前面
{
if(a[i]<a[j])
{
temp[p++]=a[i++];
}else{
temp[p++]=a[j++];
}
}
if(i==mid+1)//判断前后哪个还有数字 把数字一次性放入temp数组中
{
while(j<=right)
{
temp[p++]=a[j++];
}
}
if(j==right+1)
{
while(i<=mid)
{
temp[p++]=a[i++];
}
}
for(i=left,j=0;j<p;i++,j++)
{
a[i]=temp[j];
}
}
void mergesort(int *a,int left,int right)
{
if(left>=right)
return;
int mid=(left+right)/2;
mergesort(a,left,mid);
mergesort(a, mid+1, right);
merge(a,left,mid,right);
}
注:不断的拆分与合并
******最后建议先通过视频了解每个排序的特点在进行代码的学习