快速排序和二分查找
//从小到大排序
//快排思路:选定一个基准值,将比基准值大的放在基准值右边,小的放在基准值左边。然后通过递归来讲序列的长度继续划分为左右两边,等到最后只剩两个元素的时候交换排序,不断递归到上一层
进行排序。感觉和归并排序有点像,最后都是分为两个元素。
时间复杂度大概是O(nlogn),
空间复杂度:O(logn)
稳定性:快速排序无法保证相等的元素的相对位置不变,因此它是不稳定的排序算法
//二分查找:原理是对一个顺序的数列arr(lo,hi),从数列中间(mid)开始,中间元素arry[mid]与想要寻找的元素(num)进行比较,如果比他大,就从arr(lo,mid-1)的区间去查找,否则就去arry(mid+1,hi)的区间去找
记住hi的值要用mid去更新
#include<stdio.h> void quick_sort(int arr[],int left,int right) { int i = left, j = right, base = arr[left]; if (i >= j) return; while (i<j) { while (base <= arr[j] && i < j)//等到找到比基准值小的结束 j--; while (base >= arr[i] && i < j) //等到比基准值大的结束 i++; if (i < j) //如果左边索引小于右边索引,交换两个位置的值 { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } } arr[left] = arr[i];//将最后交换过的值放在开头 arr[i] = base;//将基准值放在最后交换过的位置上,这个位置左边比基准值小,右边比基准值大 quick_sort(arr, left, i - 1);//分别对基准值左边和右边进行递归排序。 quick_sort(arr, i + 1, right); } //二分查找
int find_i(int arr[],int lo,int hi,int value)
{
int mi=(hi+lo)/2;
while(lo<hi)
{
if(value==arr[mi])
{
return mi;
}
if(value<arr[mi])
{
hi=mi;
mi=(hi+lo)/2;
}
else
{
lo=mi;
mi=(hi+lo)/2;
}
}
return -1;
}
int main() { int arr[] = { 1 ,5,9,5,6,7 }; quick_sort(arr, 0, 5); for (int i = 0; i < 6; i++) { printf("%d ", arr[i]); }
printf("\n%d\n",find_i(arr,0,10,5)); return 0; }