1.冒泡排序(可以大的升上去,也可以小的降下来)
大的升上去:
int a[n]={}; //n个数据
for(i=0;i<n-1;i++) //n个数据,就需要比较n-1趟,每一趟最大的移到末尾
for(j=0;j<n-1-i;j++) //前几趟末尾已排好的数据,不需再排序
if(a[j]>a[j+1]) //数组的下标 j ,和趟数 i 无关
swap(a[j],a[j+1]);
小的的降下来:
int a[n]={}; //n个数据
for(i=0;i<n-1;i++) //n个数据,就需要比较n-1趟,每一趟最小的移到前段
for(j=n-1;j>i;j--) //前几趟前段已排好的数据,不需再排序 (j从后向前移动)
if(a[j-1]>a[j]) //数组的下标,和趟数i无关
swap(a[j],a[j-1]);
2.快速排序
过程如下所示:
void quick_sort(int a[],int l,int r)
{
if(l<r){
int i=l,j=r;
int x=a[l]; //初始化三个变量,其中l和r对应数组的两个边界(0和n-1),关键值x所在的位置相当于一个坑,需要别人来补,最初的坑的值已经保存到了x中。
while(i<j)
{
while(j>i&&a[j]>x)//从右边开始找小于x的值
j--;
if(i<j)
a[i++]=a[j]; //这里i++主要是因为下一步中a[i]不需要跟x比较,而是从a[i+1]开始比较。
while(i<j&&a[i]<x)//从左边开始找第一个大于x的值
i++;
if(i<j)
a[j--]=a[i];
}
a[i] = x;
quick_sort(a, l, i - 1); // 对左边递归调用
quick_sort(a, i + 1, r); //对右边递归调用
}
快速排序优化方法:
1,初始点的选择优化,即任意挑选m(比如3)个,选出最中间的数据作为初始点。
2,优化小数组排序时的排序方法,即因为快排适合于对大量数据进行排序,对小数量是体现不出优势,所以当数组数量(j-i)小于某个值(一般是7)时采用插入排序代替快排,这样能提高速度。
3,优化递归,即改成尾递归的形式,也就是把原来的两个递归调用改成一个,这样编译的速度会加快。
3.希尔排序
初始队列如上,
1.设定步长为3
前三个不动,后面元素的依次与和前面间距为3的数据比较,如1要和6比较,8要和5比较,直到前面没有间距为步长的数据。
2.设定步长为2
重复上述步骤
3.设定步长为1
重复上述步骤
希尔排序最终步长会为1来结束排序,步长的选择对算法至关重要。
二分查找
int BinarySearch(int *a,int val,int left,int right)
{
if(left > right)
return -1;
int mid = (left+right)/2;
if(a[mid] == val)
return mid;
else if(val > a[mid])
return BinarySearch(a,val,mid+1,right);
else if(val < a[mid])
return BinarySearch(a,val,left,mid-1);
}