http://blog.163.com/hadyk1111@126/blog/static/29599406200752345233993/
快速排序
http://blog.csdn.net/morewindows/article/details/6684558
分析:数据结构p186.重要
当源文件有序时复杂度是o(n2).此时冒泡排序最好,无序时快速排序是最好的方法。
void QuickSort(int *a,int l,int r)
{
if (r<=l)
{
return;
}
int i=l;
int j=r;
int x=a[i];//a[l]即a[i]就是第一个坑
//挖坑填数
while (j>i)
{
// 从右向左找小于x的数来填a[i]
while (a[j]>=x&&j>i)
{
j--;
}
if (j>i)
{
a[i]=a[j];//a[j]填到a[i]中,a[j]就形成了一个新的坑
i++;
}
// 从左向右找大于或等于x的数来填a[j]
while (a[i]<x&&j>i)
{
i++;
}
if (j>i)
{
a[j]=a[i];//将a[i]填到a[j]中,a[i]就形成了一个新的坑
j--;
}
}
//退出时,i等于j。将x填到这个坑中。
a[i]=x;
//分治法
QuickSort(a,l,i-1);
QuickSort(a,i+1,r);
}
归并排序
http://blog.csdn.net/morewindows/article/details/6678165
//将有二个有序数列a[first...mid]和a[mid...last]合并。
void mergearray(int a[], int first, int mid, int last, int temp[])
{
int i=first;
int n=mid;
int j=mid+1;
int m=last;
int k=0;
while (i<=n&&j<=m)
{
//比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数
if (a[i]<a[j])
{
temp[k++]=a[i++];
}
else
{
temp[k++]=a[j++];
}
}
//有数列为空,那直接将另一个数列的数据依次取出即可
while (i<=n)
{
temp[k++]=a[i++];
}
while (j<=m)
{
temp[k++]=a[j++];
}
for (i=0;i<k;i++)
{
a[first+i]=temp[i];
}
}
void mergesort(int a[], int first, int last, int temp[])
{
if (first < last)
{
int mid = (first + last) / 2;
mergesort(a, first, mid, temp); //左边有序
mergesort(a, mid + 1, last, temp); //右边有序
mergearray(a, first, mid, last, temp); //再将二个有序数列合并
}
}