排序

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);
    
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值