快速排序
是一个递归过程,不稳定的排序算法
#include<iostream>
using namespace std;
void quick_sort(int a[],int l,int r)
{
int i,j;
int x= a[(l+r)/2];
if(l>=r) return;
i=l-1,j=r+1;
while(i<j)
{
do(i++); while(a[i]<x);
do(j--) ;while(a[j]>x);
if(i<j) swap(a[i],a[j]);
}
quick_sort(a,l,j);
quick_sort(a,j+1,r);
}
直接插入排序(稳定的排序算法)
按顺序将数插入到前面已经排序好的位置当中,重复这操作知道最后一位,完成
1.将开头元素视为已排序
2.执行以下处理,直到未排序部分消失
取出未排序部分的开头元素赋给变量v
在已排序部分,将所有比v大的元素向后移动一个单位
将以取出的元素v插入空位
int main()
{
int a[] = {9,5,4,1,3,6,7,10,2,8};
quick_sort(a,0,9);
for(int i=0;i<10;i++)
{
cout <<a[i]<<" ";
}
cout <<endl;
return 0;
}
```cpp
#include<iostream>
using namespace std;
const int N = 1100;
int main()
{
int n,i;
int a[N];
cin >>n;
for(i=0;i<n;i++) cin >>a[i];
for(i=1;i<n;i++)
{
int d=a[i];
int j=i-1;
while(j>=0&&a[j]>d)
{
a[j+1] = a[j];
j--;
}
a[j+1] = d;
}
for(i=0;i<n;i++)
cout << a[i] <<" ";
cout<<endl;
return 0;
}
冒泡排序(稳定)
算法中插入flag便于快速结束排序,节省一定的时间;
这里cnt代表运行次数。。。。。
#include<iostream>
using namespace std;
int main()
{
int n,i;
int a[110],cnt =0;
int flag=0;
cin >>n;
for(i=0;i<n;i++) cin >>a[i];
for(i=0;i<n;i++)
{
flag=0;
for(int j=n-1;j>i;j--)
{
if(a[j] <a[j-1])
{
swap(a[j],a[j-1]);
flag=1;
cnt++;
}
}
if(!flag)
break;
}
for(i=0;i<n;i++)
cout <<a[i] <<" ";
cout <<cnt;
return 0;
}
选择排序(不稳定)
cnt 表示交换次数
#include<iostream>
using namespace std;
int main()
{
int n,i,a[100];
int cnt=0;
cin >>n;
for(i=0;i<n;i++) cin >>a[i];
for(i=0;i<n;i++)
{
int min = i;
for(int j=i;j<n;j++)
{
if(a[j]<a[min])
min = j;
}
if(i!=min)
swap(a[i],a[min]),cnt++;
}
for(i=0;i<n;i++)
cout <<a[i]<<" ";
cout <<endl<<cnt;
return 0;
}
归并排序
稳定排序算法
运行时需要临时占用额外的内存空间
1.将给定的n个元素的局部数组分割成两个局部数组,每个数组包含n/2个元素
2.对两个局部数组分别执行排序
3.整合成一个数组
递归分割成最小部分,然后整合。
#include<iostream>
using namespace std;
const int N= 100010;
int n;
int L[N],R[N];
void mergesort(int a[],int l,int r)
{
int i;
if(r-l>1)
{
int mid = (l+r)/2;
mergesort(a,l,mid);
mergesort(a,mid,r);
int n1 = mid-l;
int n2 = r-mid;
for(i=0;i<n1;i++) L[i] = a[i+l];
for(i=0;i<n2;i++) R[i] = a[mid +i];
L[n1] = R[n2] = 10000000;
int a1=0,a2=0;
for(int k=l;k<r;k++)
{
if(L[a1]<=R[a2]) a[k] = L[a1++];
else a[k] = R[a2++];
}
}
}
int main()
{
int a[N],i;
cin >>n;
for(i=0;i<n;i++) cin >>a[i];
mergesort(a,0,n);
for(i=0;i<n;i++) cout <<a[i]<< " ";
cout <<endl;
return 0;
}