快速排序和二分查找

//从小到大排序
//快排思路:选定一个基准值,将比基准值大的放在基准值右边,小的放在基准值左边。然后通过递归来讲序列的长度继续划分为左右两边,等到最后只剩两个元素的时候交换排序,不断递归到上一层

进行排序。感觉和归并排序有点像,最后都是分为两个元素。

时间复杂度大概是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(" %d ",find_i(arr,0,10,5));
return 0; }
原文地址:https://www.cnblogs.com/zongji/p/13321760.html