快速排序和二分查找(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()

var index = binarySearch(data, 4)   fmt.Println(index)}

func performQuickSort(data []int) {   defer waitGroup.Done()   quickSort(data, 0, len(data)-1)   fmt.Println(data)}

func quickSort(data []int, left int, right int) {   index := partition(data, left, right)

if left < index-1 {      quickSort(data, left, index-1)   }

if right > index {      quickSort(data, index, right)   }}

func partition(data []int, left int, right int) int {   i := left   j := right

pivot := data[left+(right-left)/2]

for i <= j {

for data[i] < pivot {         i++      }

for data[j] > pivot {         j--      }

if i <= j {         temp := data[i]         data[i] = data[j]         data[j] = temp         i++         j--      }   }

return i;}

func binarySearch(data []int, target int) int {

left := 0;   right := len(data) - 1

for left <= right {      mid := left + (right-left)/2      if data[mid] < target {         left = mid + 1      }

if data[mid] >= target {         right = mid - 1      }   }

return left}

原文地址:https://www.cnblogs.com/feicheninfo/p/9283350.html

时间: 2024-11-05 17:19:36

快速排序和二分查找(Go)的相关文章

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

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

快速排序与二分查找

#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 &am

快速排序和二分查找(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

编程算法 - 快速排序(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