数组的查找与排序

目录

元素的查找

线性查找

折半查找

递归二分查找

排序

直接插入排序

选择排序

冒泡排序

冒泡算法改进——没有交换就终止 


元素的查找

线性查找

从第一个元素开始查找,一直到第n个;

int findEle(int a[], int n, int x)
{
    int i;
    for(int i = 0; i < n&&a[i] != x; i++);
    if(i >= n) return -1;
    else return i;
}

折半查找

反复把查找区间折半;

int binarySearch(int a[], int n, int x)
{
    int i, j, m;
    for(i = 0, j = n-1; i <= j;)
    {
        m = (i + j)/2;
        if(x == a[m]) return m;
        else if(x > a[m]) i = m + 1;
        else j = m - 1;
    }
    return -1;
}

递归二分查找

和上面不用递归本质上是一样的

int recBiSearch(int a[],int x,int i,int j)
{ 
    int m;  
    if (i<=j)
    {
      m = (i + j)/2;
      if (x == a[m])
        return m;
      else if (x < a[m])
       return recBiSearch(a,x,i,m-1);
      else
       return recBiSearch(a,x,m+1,j);
    }
    else return -1;
}

排序

直接插入排序

void insertSort(int a[],int n) {
	int i,j,tmp;
	for (i=1; i<n; i++){
            tmp = a[i];
		for (j=i-1; j>=0 && a[j]>tmp; j--){
				//若已排序列比之大则后移
                a[j+1] = a[j];
		}
		a[j+1] = tmp;//插入当前元素
	}

最后采用j+1是因为for循环结束时采用了j--的操作,需要使用+1来弥补

选择排序

void selectSort(int a[],int n)  
{	int i,j,max,tmp;
	for (i=1; i<=n-1; i++){
		max = n-i;
		for (j=0; j<=n-1-i; j++){		
			if (a[j] > a[max])
				max = j;
		}
		if (n-i != max){ 
		   tmp = a[n-i];
		   a[n-i] = a[max];
		   a[max] = tmp;
		}        
	} 
}   

冒泡排序

void bubbleSort(int a[],int n){
    int i,j,tmp;
    for (i=1;i<=n-1;i++){
        for (j=0;j<=n-1-i;j++){
            if (a[j]>a[j+1]){
                tmp=a[j];
                a[j]=a[j+1];
                a[j+1]=tmp;
            }
        }
    }

冒泡算法改进——没有交换就终止 

int bubbleSort2(int a[],int n)
{
	int i,j,tmp,swap;
	
	for(i=1,swap=1; i<=n-1 && swap>0; i++){ 
	    for(j=0,swap=0; j<=n-1-i; j++){    
		   if(a[j] > a[j+1]){
		     tmp = a[j];
		     a[j] = a[j+1];
		     a[j+1] = tmp;
		     swap++;
		   }
		}
	}
	return i;//返回排序的趟数 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值