快速排序算法 golang实现

快速排序算法 golang实现



算法描述


算法描述:是对插入算法的一种优化,利用对问题的二分化,实现递归完成快速排序 ,在所有算法中二分化是最常用的方式,将问题尽量的分成两种情况加以分析, 最终以形成类似树的方式加以利用,因为在比较模型中的算法中,最快的排序时间 负载度为 O(nlgn)。


算法步骤


  1. 将数据根据一个值按照大小分成左右两边,左边小于此值,右边大于
  2. 将两边数据进行递归调用步骤1
  3. 将所有数据合并

代码


package main

import "fmt"

func QuickSort1(arr []int) []int {
	if len(arr) <= 1 {
		return arr
	}
	splitData := arr[0]  		 //第一个数据
	low := make([]int, 0, 0)  	 //比第一个数小的数据
	high := make([]int, 0, 0)   //比第一个数大的数据
	mid := make([]int, 0, 0)   	 //与第一个数一样大的数据
	mid = append(mid, splitData) //把第一个数加入到mid切片
	for i := 1; i < len(arr); i++ {
		if arr[i] < splitData {
			low = append(low, arr[i])
		} else if arr[i] > splitData {
			high = append(high, arr[i])
		} else {
			mid = append(mid, arr[i])
		}
	}
	low, high = QuickSort1(low), QuickSort1(high)
	myArr := append(append(low, mid...), high...)
	return myArr
}

func QuickSort2(left int, right int, arr []int)  {
	i, j := left, right
	mid := arr[(left + right) / 2]    //将当前序列在中间位的数定义为分隔数
	for i <= j {
		for arr[i] < mid {     //扫描左半部分比分隔数大的数
			i++
		}
		for arr[j] > mid {     //扫描右半部分比分隔数小的数
			j--
		}
		if i <= j {     //交换上述找到的两个数
			arr[i], arr[j] = arr[j], arr[i]
			i++
			j--
		}
	}
	if left < j {
		QuickSort2(left, j, arr)
	}
	if i < right {
		QuickSort2(i, right, arr)
	}
}

func main() {
	arr := []int{1, 9, 10, 30, 2, 5, 45, 8, 63, 234, 12}
	fmt.Println(QuickSort1(arr))
	//QuickSort2(0, len(arr) - 1, arr)
	//fmt.Println(arr)
}

输出结果:

[1 2 5 8 9 10 12 30 45 63 234]

目测QuickSort2会更节约内存,因为每调用一次QuickSort1都会为3个切片分配底层数组,如果数据非常大,可能会非常耗费内存。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值