作者实属太菜所以写的很简单,就直接上函数块吧。再一个就是sort函数真香,一般情况下,只要不是那种恶心人的题目都不会卡sort。
排序方法
选择排序
- 每一次选择最小的插再已经排序好的下一个。
void xzsort(int a[], int n)
{
for(int i = 0; i < n-1; ++i)
{
int te = i;
for(int j = i+1; j < n; ++j)
{
if(a[j] < a[te])
{
te = j;
}
}
int t = a[i];
a[i] = a[te];
a[te] = t;
}
}
插入排序
- 分为无序和有序俩部分,一直循环直到无序部分没用元素。
void crsort(int a[], int n)
{
for(int i = 1; i < n; ++i)
{
//a[i]是最左边的无序元素,
for(int j = 0; j < i; ++j)
{
//要把a[i]放到位置j原下标j到i-1的元素全部后移一位
int te = a[i];
for(int k = i; k > j; --k)
{
a[k] = a[k-1];
}
a[j] = te;
break;
}
}
}
冒泡排序
- 从最左边的元素开始,一次向后判断大小,根据需要后移。
void mpsort(int a[], int n)
{
for(int i = 0; i < n; ++i)
{
for(int j = i+1; j < n; ++j)
{
if(a[i] > a[j])
{
int te = a[i];
a[i] = a[j];
a[j] = te;
}
}
}
}
归并排序
利用分治,把数组分成各个小任务分别完成,再合并在一起。需要俩个数组,一个数组排序每一个数组存储。
void Merge(int a[],int s, int m, int e, int tmp[])
{
int pb = 0;//指向tmp
int p1 = s, p2 = m+1;//分别指向俩半
while(p1 <= m && p2 <= e)
{
if(a[p1] < a[p2])
{
tmp[pb++] = a[p1++];
}
else
{
tmp[pb++] = a[p2++];
}
}
while (p1 <= m)
{
tmp[pb++] = a[p1++];
}
while (p2 <= e)
{
tmp[pb++] = a[p2++];
}
for(int i = 0; i < e-s+1; ++i)
a[i+s] = tmp[i];//从起点赋值,注意一定要加s!!!
}
void Mergesort(int a[],int s, int e,int tmp[])
{
if(s < e)//分治
{
int m = s+(e-s)/2;
Mergesort(a,s,m,tmp);
Mergesort(a,m+1,e,tmp);
Merge(a,s,m,e,tmp);
}
}
快速排序
- 找关键的k值,然后根据大小排序在k左右俩边;
void qsort(int a[],int s, int e)
{
if(s >= e) return;
int k = a[s];
int i = s, j = e;
while (j != i)
{
while(j > i && a[j] >= k)
--j;
swap(a[i],a[j]);
while(i < j && a[i] <= k)
++i;
swap(a[i],a[j]);
}
qsort(a,s,i-1);
qsort(a,i+1,e);
}