首先是两种排序的算法:冒泡排序与希尔(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;
}
}
冒泡排序与希尔排序效率比较,希尔排序较高,但是希尔排序不稳定,冒泡排序稳定。希尔排序比较难理解,可以多查阅其它资料进行了解。当然二分查找也是更简单不过的了,希望这篇博客可以帮助大家重新理清概念与思路。