一维数组 冒泡排序 shell 排序 二分查找 C++

首先是两种排序的算法:冒泡排序与希尔(shell)排序

冒泡排序的平均时间复杂度是O(n^2),最好的时间复杂度为O(n),空间复杂度是1;

希尔排序的时间复杂度是O(nlogn),空间复杂度也是1;

时间复杂度大家应该比较清楚,then what is 空间复杂度?

空间复杂度:如果排序算法所需的辅助空间并不依赖于问题的规模n,则辅助空间为O(1),也称作就地排序(In-PlaceSort),非In-PlaceSort一般要求辅助空间为O(n)。———摘自《程序员面试宝典》。


由于二分查找所针对的是有序队列,所以在对队列查找之前,需要对队列进行排序。这里以对数组进行排序为例。一个是冒泡排序,一个是希尔排序。

冒泡排序:从数组下标为0的数据开始,向后与相邻数据进行比较,如果小于后面相邻数据,则以后面较大的数据继续向后进行比较;如果大于,则交换之后继续向后比较。直到最大的数据排在数组的最后,这样就结束一轮。然后进行第二轮,找到次大的数据,结束之后,次大的数据排在数组的倒数第二位置。。。。

冒泡排序算法代码:

void Bubble_sort(int* arr, int n)  //排序函数输入数组指针arr与数组长度n
{
    for(int j=0;j<n;j++)     //外层循环,每一轮都会使最大的数据排在数组后面
    {
        for(int k=0;k<n-j;k++)  //内层循环,进行数据的比较
        {
            if(arr[k]>arr[k+1])
            {
                arr[k]=arr[k]+arr[k+1];
                arr[k+1]=arr[k]-arr[k+1];
                arr[k]=arr[k]-arr[k+1];
            }
        }
    }
}


希尔排序算法:举例子说吧,是个数据的数组,先分成前5个,后5个数据两组,然后index=0和index=5的数据进行对比,index=1和index=6的进行对比,对比结果大的排在数组的后面,否则不进行交换。第二步,数组分成下表(0,1,2,3)(3,4,5,6)(6,7,8,9)的三组,然后对应index=0,3,6,9对比,index=1,4,7对比,结果较大的排在后面。直到最后分组的下表增量为1,然后比较结束,即可得到排序后的数组。

希尔排序算法代码:

void Shell_sort(int* arr, int n)
{
int len=n;
while(n>1)
    {
        n=(n+1)/2;             //分组数据的下标增量,以数组长度为10为例,下标增量依次为5,3,2,1.
        for(int i=0;i<len-n;i++)
        {
            if(arr[i]>arr[i+n])
            {
                arr[i]=arr[i]+arr[i+n];
                arr[i+n]=arr[i]-arr[i+n];
                arr[i]=arr[i]-arr[i+n];
            }
        }
	for(int k=0;k<len;k++)    //打印出每次分组排序后的结果
		cout << arr[k] << " ";
	cout << endl;
    }
}



数据排序结束后,可进行查找。

二分查找算法:二分查找算法定义三个数据索引,low,mid,high。当查找的数据大于mid所指向的数据,则low=mid+1,否则high=mid-1。然后继续进行比较,直到找到或者找不到为止。

二分法查找代码:

    int k;
    cout << "input number to search:";
    cin >> k;
    int low,mid,high;
    low=0;high=n;
    mid=(high+low)/2;
    while(high>=low)   //一直循环查找
    {
        if(arr[mid]>k)
        {
            high=mid-1;
            mid=(high+low)/2;
        }
        else if(arr[mid]<k)
        {
            low=mid+1;
            mid=(high+low)/2;
        }
        else if(arr[mid]==k)
        {
            cout << "The position of searched number is: " << (mid+1) << endl;  //返回查找到的结果,结束程序
            return 0;
        }
        else
        {
            cout << "Not Found!!!" << endl;    // 结果没有找到,结束程序
            return 0;
        }
    }



冒泡排序与希尔排序效率比较,希尔排序较高,但是希尔排序不稳定,冒泡排序稳定。希尔排序比较难理解,可以多查阅其它资料进行了解。当然二分查找也是更简单不过的了,希望这篇博客可以帮助大家重新理清概念与思路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值