快速排序与二分查找

#include <iostream>
#include <string>
using namespace std;

void quicksort(int arry[], int low, int high)
{
    int oldlow = low;
    int oldhigh = high;

    if(low >= high)
    {
        return;
    }
    int key = arry[low];
    while(low < high)
    {
        while(low < high && arry[high] > key){ --high; };
        arry[low] = arry[high];

        while(low < high && arry[low] < key) { ++low; };
        arry[high] = arry[low];
    }
    arry[low] = key;
    quicksort(arry, oldlow, low - 1);
    quicksort(arry, high + 1, oldhigh);

}

bool binarysearch(int arry[], int n, int low, int high, int &key, int &index)
{
    if(low > n - 1 || high < 0 || low > high)
    {
        cout<<"can‘t find "<<key<<endl;
        return false;
    }
    int middle = (low + high) % 2 == 0 ? (low + high) / 2 : (low + high) / 2 + 1;
    if(arry[middle] == key)
    {
        index = middle;
        return true;
    }
    else
    {
        if(arry[middle] > key) high = middle - 1;
        if(arry[middle] < key) low = middle + 1;
    }

    return binarysearch(arry, n, low, high, key, index);
}

int main()
{
    int arry[] = {1,2,6,7,854,23,4,22,44,55};
    int size = sizeof(arry)/sizeof(arry[0]);
    quicksort(arry, 0, size -1);
    cout<<"arry size is "<<size<<", after sort is:"<<endl;
    for(int i = 0; i < size; ++i)
    {
        cout<<arry[i]<<",";
    }
    cout<<endl;
    cout<<"binarysearch test."<<endl;
    int index;
    int value = 854;
    if(binarysearch(arry, size, 0, size - 1, value, index))
    {
        cout<<"find "<<value<<" ok, index is "<<index<<endl;
    }
    value = 54;
    if(binarysearch(arry, size, 0, size - 1, value, index))
    {
        cout<<"find "<<value<<" ok, index is "<<index<<endl;
    }

    return 0;
}

  

  

2 2 4 9 3 6 7 1 5 首先用2当作基准,使用i j两个指针分别从两边进行扫描,把比2小的元素和比2大的元素分开。首先比较2和5,5比2大,j左移

2 2 4 9 3 6 7 1 5 比较2和1,1小于2,所以把1放在2的位置

2 1 4 9 3 6 7 1 5 比较2和4,4大于2,因此将4移动到后面

2 1 4 9 3 6 7 4 5 比较2和7,2和6,2和3,2和9,全部大于2,满足条件,因此不变

经过第一轮的快速排序,元素变为下面的样子

[1] 2 [4 9 3 6 7 5]

时间: 2024-10-12 19:42:18

快速排序与二分查找的相关文章

学习快速排序和二分查找算法

1. 快速排序的思想采用的是分治算法实现,从头选择一个元素是作为"哨兵元素",然后从尾部开始寻找一个比"哨兵元素"小的元素,然后跟它交换,接着从头开始寻找比"哨兵元素"大的:元素,然后交换,直到"哨兵元素"的左边都"哨兵元素"小,右边都比"哨兵元素"大为止,这算是一次划分,快速排序是要经过的 k-1趟(假设有k个元素)划分才能排序好所有的元素. 下面根据分治实现的java代码: publ

C语言练习题1(关于快速排序,二分查找与运行时间)

刚刚完成师兄给的一道题目: 随机生成10000位数,进行快速排序后,用二分查找法定位到某个要查询的数(键盘输入某个要查询的数),  结果输出查询的时间,以及是否查到 分享下自己的解题思路: 1,要懂得如何随机生成数 2,要了解快速排序以及二分法思想 3,要直到如何测试出程序运行时间 下面是自己写的代码,欢迎各位提出宝贵的意见以及见解,小生感激不尽 1 /* 2 本代码描述: 3 4 随机生成10000位数,进行快速排序后, 5 用二分查找法定位到某个要查询的数 6 (键盘输入某个要查询的数),

JS冒泡排序,快速排序,二分查找

//冒泡排序 思想:一个数组双层循环,判断左右相邻的两个数值,大的在右小的在左,如果左的比右的大,双方替换位置 之所以要数组的长度减一,是因为数组是从0开始的,比如说一个数组有7个元素,它的长度为7,分别为a[0],a[1],a[2],a[3]a[4],a[5],a[6]这7个所以当你要取数组中最后一个a[6]时是需要用长度减1的而为什么要减i呢,则是因为你的冒泡排序是把最大的放到最后一位,比如第一次循环的时候进行排序完,最后一位是最大的了,根本没有必要在第二次循环当中把他在拿去比大小了吧,并且

快速排序和二分查找

快排和二分查找都基于一种叫做「分治」的算法思想,通过对数据进行分类处理,不断降低数量级,实现O(logN)(对数级别,比O(n)这种线性复杂度更低的一种,快排核心是二分法的O(logN),实际复杂度为O(N*logN))的复杂度. 快速排序 快排大概的流程是: 随机选择数组中的一个数 A,以这个数为基准 其他数字跟这个数进行比较,比这个数小的放在其左边,大的放到其右边 经过一次循环之后,A 左边为小于 A 的,右边为大于 A 的 这时候将左边和右边的数再递归上面的过程 const Arr = [

选择排序、冒泡排序、快速排序和二分查找的C语言实现

1 #include <stdio.h> 2 3 #define ASC 0 //升序,从左到右,从小到大 4 #define DESC 1 //降序,从左到右,从大到小 5 #define TRUE 1 //布尔值,真 6 #define FALSE 0 //布尔值,假 7 8 typedef int datatype; //定义数组元素的类型,这里暂定为int 9 10 void selectSort(datatype array_to_sort[], int length, int mo

快速排序和二分查找(Java)

import java.util.Arrays; public class Main { public static void main(String[] args) { int[] data = {2, 3, 5, 1, 4, 5, 2, 13, 51, 9, 10, 15, 17, 6, 21, 33, 44, 77, 22}; System.out.println(Arrays.toString(data)); quickSort(data, 0, data.length - 1); Sy

快速排序和二分查找(Go)

package main import ( "fmt" "sync") var waitGroup sync.WaitGroup func main() { data := []int{2, 3, 5, 1, 4, 5, 2, 13, 51, 9, 10, 15, 17, 6, 21, 33, 44, 77, 22} fmt.Println(data) waitGroup.Add(1) go performQuickSort(data) waitGroup.Wait

编程算法 - 快速排序(QuickSort)和二分查找(BinarySearch)

快速排序(QuickSort)和二分查找(BinarySearch) 本文地址: http://blog.csdn.net/caroline_wendy 快速排序和二分查找的定义, 网上书上都有, 本文主要是讲解如何写出这两个经典算法. 程序员必须掌握的两种算法, 使用任何语言, 使用纸都是必须的. 快速排序(C): /* * main.cpp * * Created on: 2014年9月10日 * Author: Spike */ #include <stdio.h> #include &

顺序表的增删查改、二分查找、冒泡和快速排序

SeqList 声明文件 #pragma once #define MAX_SIZE 5 typedef int DataType; typedef struct SeqList { DataType array[MAX_SIZE]; size_t size; }SeqList; void PrintSeqList(SeqList* pSeq); void InitSeqList(SeqList* pSeq);//初始化 void PushBack(SeqList* pSeq, DataType