1、冒泡排序:
逐个交换,将最大的值交换到最后的位置上去。
int sort(int *a, int n)
{
int i,j;
for(i=0; i<n-1;i++)
for(j=0; j<n-1-i; j++)
if(a[j]>a[j+1])
{
int x = a[j];
a[j] = a[j+1];
a[j+1] = x;
}
return 1;
}
2、直接插入排序
假定前面的有序,将后面未排好序的元素的第一个插入到前面的有序序列中去,寻找插入点的方法为从后向前捉个比较。
int sort(int * a,int n)
{
int i,j,k;
for(i=1;i<n;i++)
{
int temp = a[i];
j=i-1;
while(temp<a[j])
{
j--;
}
for(k=i;k>j+1;k--)
a[k]=a[k-1];
a[k]=temp;
}
return 0;
}
3、二分插入排序
假定前面的有序,将后面未排好序的元素的第一个插入到前面的有序序列中去,寻找插入点的方法为二分查找。
int sort2(int * a,int n)
{
int i,j,k;
for(i=1;i<n;i++)
{
int low = 0,high =i-1;
int key = a[i];
while(low<=high)
{
int mid = (low+high)/2;
if(a[mid]>key)
{
high = mid -1;
}
else if( a[mid]<key)
{
low = mid+1;
}
else
{
j = mid + 1;
break;
}
}
if(low>high)
{
j = low;
}
for(k=i;k>j;k--)
a[k]=a[k-1];
a[k]=key;
}
return 0;
}
4、选择排序
选择一个最小的数排到第一个位置上
int sort3(int * a,int n)
{
int i,j,k;
for(i=0;i<n-1;i++)
{
int key = i+1;
for(j=i+2;j<n;j++)
{
if(a[key] >a[j])
key = j;
}
if(a[i]>a[key])
{
int temp = a[i];
a[i] = a[key];
a[key]=temp;
}
}
return 0;
}
5、快速排序
从右边找一个比第一个数小的放到左边,在从左边找一个比第一个数大的放到右边,这样反复的寻找,直到左边的全部小于第一个数,右边的全部大于第一个数
int psort(int * a ,int low ,int high)
{
int temp=a[low];
while(low<high)
{
while( low<high && a[high]>=temp )
{
high--;
}
if(low<high)
{
a[low++]=a[high];
}
while(low<high && a[low]<=temp)
{
low++;
}
if(low<high)
{
a[high--]=a[low];
}
}
a[low]=temp;
return low;
}
int qsort(int *a,int l,int r)
{
if(l<r)
{
int key = psort(a,l,r);
psort(a,l,key-1);
psort(a,key+1,r);
}
return 0;
}