1、快速排序
方法:选择数组中的一个数,将数组中比它小的数放在它的左边,数组中比它大的数放在它的右边,然后递归(而这样的方法有很多,这里仅是总体思想)
举个栗子:挖坑填坑法(这名字绝逼不是我取的)
先上代码:
int a[10];
void sort_(int m,int n)
{
if(m>=n) return;
//递归条件。注意这里的>=是因为若所取的数为a[m]时,递归则会去取m到m-1为范围
int i=m, j=n,t;
t = a[i];
while (i != j)
{
for (;a[j] > t&&j>i;j--);
a[i] = a[j];
if(i!=j)
{
for (;a[i] <= t&&i<j;i++);
a[j] = a[i];
}
}
a[i] = t;
sort_(m, i-1);
//递归的取值范围必须是所取数的下标+1/-1到最大/最小,否则会死循环
sort_(i+1, n);
}//本快排由律爷特约修改播出
2、归并排序
方法:(其实是分治法的具体体现)先将数组近乎平等地分成两份,两份各自分别排序,再将左右两数组的元素从第一个开始比较,小的则取出存进新数组,大的继续和另一个数组的下一个元素比较,最后将新数组复制到原数组,递归完成。
直接上代码:
int A[10],T[10];//在自定义函数里的定义数组容易出现未知错误,所以尽量开全局数组
void merge_sort(int A[], int x,int y,int T[])
{
if (y - x > 1)
{
int m = x + (y - x) / 2;
//相比与(x+y)/2,这里的优势在于向0取整,即正数时两式相同,负数时(x+y)/2会向小 的一方取整
int p = x, q = m, i = x;
merge_sort(A, x, m, T);
merge_sort(A, m, y, T);
while (p < m || q < y)
{
if (q >= y || (p < m&&A[p] <= A[q]))
//后面一个条件不可省略其中的p<m,否则即使一个数组的数已经比较完毕,依然会 在新书组中存入已比较完毕的数组的最后一个元素
T[i++] = A[p++];
else
//((q<y && A[p]>A[q]) || p>=m)
T[i++] = A[q++];
}
for (i = x;i < y;i++)
A[i] = T[i];
}
}
//至于两种算法对于相同数组元素的排序的影响应该不大,没二分查找那么麻烦