冒泡(bubblesort)、选择排序、插入排序、快速排序
冒泡排序(bubblesort)
特点:通过换位置的方式,一直向上冒泡
package main import "fmt" func bubbleSortAsc(arrayA []int){
for i:=0; i < len(arrayA); i++ {
for j:=0; j < len(arrayA)-1-i; j++ {
if arrayA[j] > arrayA[j+1]{
arrayA[j], arrayA[j+1] = arrayA[j+1], arrayA[j]
}
}
}
fmt.Println(arrayA)
} func bubbleSortDesc(arrayA []int){
for i:=0; i < len(arrayA); i++{
for j:=0; j < len(arrayA)-1-i; j++{
if arrayA[j] < arrayA[j+1]{
arrayA[j], arrayA[j+1] = arrayA[j+1], arrayA[j]
}
}
}
fmt.Println(arrayA)
} func main(){
var arrayA []int = []int{1,3,5,2,9,10,6,4,8,7}
bubbleSortAsc(arrayA)
bubbleSortDesc(arrayA)
}
快速排序(quicksort)
基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分都要小,然后再按此方法对两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
复杂度:快速排序是最不稳定的算法,最坏的时间复杂度是O(n2),最好的时间复杂度是 nlogn,空间复杂度是O(logn)
demo:
package main import "fmt" func QuickSort(aSlice []int, start, end int) {
if start >= end {
return
} var low, high = start, end //low 为由左向右的游标, high为由右向左的游标
var mid = aSlice[start] // 基数 for low < high {
//如果 low 与 high 未重合,high指向的元素不比基准元素小,则high往左移动
for low < high && aSlice[high] >= mid {
high--
}
aSlice[low] = aSlice[high] //如果 low 与 high 未重合,low指向的元素不比基准元素小,则low往右移动
for low < high && aSlice[low] < mid {
low ++
}
aSlice[high] = aSlice[low]
} //将基准元素放到该位置
aSlice[low] = mid
//对基准元素左边的子序列进行快速排序
QuickSort(aSlice, start, low - 1)
//对基准元素右边的子序列进行快速排序
QuickSort(aSlice, low + 1, end)
} func main (){
var aSlice = []int{2,5,4,6,9,8,10,1,3,7}
QuickSort(aSlice, 0, len(aSlice) - 1)
fmt.Println(aSlice)
}
python 版本:
# coding: utf8 def quick_sort(alist, start, end):
if start >= end:
return # low为由左向右的游标, high为由右向左的游标
low = start
high = end
mid = alist[start] # 基数 while low < high:
# 如果 low 与 high 未重合,high指向的元素不比基准元素小,则high往左移动
while low < high and alist[high] >= mid:
high -= 1
alist[low] = alist[high] # 如果 low 与 high 未重合,low指向的元素不比基准元素小,则low往右移动
while low < high and alist[low] < mid:
low += 1
alist[high] = alist[low] # 将基准元素放到该位置
alist[low] = mid
# 对基准元素左边的子序列进行快速排序
quick_sort(alist, start, low - 1)
# 对基准元素右边的子序列进行快速排序
quick_sort(alist, low + 1, end) if __name__ == '__main__':
# alist = [2, 5, 4, 6, 9, 7, 8, 1, 10, 3]
alist = [6, 5, 8, 2, 9, 4, 10, 1, 3, 7]
quick_sort(alist, 0, len(alist) - 1)
print(alist)
插入排序(insertsort)
像打扑克牌时的抓牌,第一张牌是不需要插入的,第二张牌开始就需要插入了,根据习惯,这里是从右往左看,小的一直往左边挪,一旦确认位置就退出循环(去抓下一张牌)
package main import "fmt" func insertSortAsc(arrayA []int){
for i:=1; i < len(arrayA); i++ {
for j:=i; j > 0; j-- {
fmt.Println(arrayA[j])
if arrayA[j-1] > arrayA[j]{
arrayA[j-1], arrayA[j] = arrayA[j], arrayA[j-1]
} else {
break
}
} }
fmt.Println(arrayA)
} func insertSortDesc(arrayA []int){
for i:=1; i < len(arrayA); i++{
for j:=i; j > 0; j--{
if arrayA[j-1] < arrayA[j]{
arrayA[j-1], arrayA[j] = arrayA[j], arrayA[j-1]
} else {
break
}
}
}
fmt.Println(arrayA)
} func main(){
var arrayA []int = []int{3,1,5,2,9,10,6,4,8,7}
insertSortAsc(arrayA)
insertSortDesc(arrayA)
}
冒泡(bubblesort)、选择排序、插入排序、快速排序的更多相关文章
- Python学习之---冒泡,选择,插入排序
Python学习之---冒泡,选择,插入排序 最近学习了python基础,写一下3大排序练练手: 1 ''' 2 Created on 2013-8-23 3 4 @author: codegeek ...
- 学习C#之旅 冒泡排序,选择排序,插入排序,希尔排序[资料收集]
关于冒泡排序,选择排序,插入排序,希尔排序[资料收集] 以下资料来源与网络 冒泡排序:从后到前(或者从前到后)相邻的两个两两进行比较,不满足要求就位置进行交换,一轮下来选择出一个最小(或最大)的放到 ...
- 基于python语言的经典排序法(冒泡法和选择排序法)
前 每逢周末就遇雨期,闲暇之余,捣鼓了下python,心心念想学习,今天就在电脑上装了个2.7,学习了下经典算法,冒泡与选择排序法 第一次写关于python的文章,说的不当之处,多多指正,我积极改正 ...
- python算法(一)基本知识&冒泡排序&选择排序&插入排序
本节内容: 算法基本知识 冒泡排序 选择排序 插入排序 1. 算法基本知识 1.1 什么是算法? 算法(algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为 ...
- 数组排序-冒泡排序-选择排序-插入排序-希尔排序-快速排序-Java实现
这五种排序算法难度依次增加. 冒泡排序: 第一次将数组相邻两个元素依次比较,然后将大的元素往后移,像冒泡一样,最终最大的元素被移到数组的最末尾. 第二次将数组的前n-1个元素取出,然后相邻两个元素依次 ...
- Javascript中的冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序 算法性能分析
阿里面试中有一道题是这样的: 请用JavaScript语言实现 sort 排序函数,要求:sort([5, 100, 6, 3, -12]) // 返回 [-12, 3, 5, 6, 100],如果你 ...
- 第四篇、C_快速、冒泡、选择、插入排序、二分查找排序、归并、堆排序
1.快速排序 实现: 1.取中间一个数作为支点 2.分别在支点的左右两边进行查找,如果左边查找到比支点大,右边查找到比支点小,就交换位置,如此循环,比支点小的数就排在了左边,比支点大的就排在右边 3. ...
- 算法分析中最常用的几种排序算法(插入排序、希尔排序、冒泡排序、选择排序、快速排序,归并排序)C 语言版
每次开始动手写算法,都是先把插入排序,冒泡排序写一遍,十次有九次是重复的,所以这次下定决心,将所有常规的排序算法写了一遍,以便日后熟悉. 以下代码总用一个main函数和一个自定义的CommonFunc ...
- 几种排序方式的java实现(01:插入排序,冒泡排序,选择排序,快速排序)
以下为集中排序的java代码实现(部分是在引用别人代码): 插入排序(InsertSort): //代码原理 public static void iSort(int[] a){ for(int i ...
- php基础排序算法 冒泡排序 选择排序 插入排序 归并排序 快速排序
<?php$arr=array(12,25,56,1,75,13,58,99,22);//冒泡排序function sortnum($arr){ $num=count($arr); ...
随机推荐
- 设备树中的interrupts属性解析
interrupts属性会有两种不同的参数: 1. 带两个参数的情形 示例: interrupt-parent = <&gpio2>; interrupts = <5 1& ...
- Kibana的安装与配置
Kibana的安装与配置 配置 [root@es01 kibana-5.6.3-linux-x86_64]# egrep -v '^$|^#' config/kibana.yml server.hos ...
- PAT 甲级 1049 Counting Ones (30 分)(找规律,较难,想到了一点但没有深入考虑嫌麻烦)***
1049 Counting Ones (30 分) The task is simple: given any positive integer N, you are supposed to co ...
- PAT 甲级 1038 Recover the Smallest Number (30 分)(思维题,贪心)
1038 Recover the Smallest Number (30 分) Given a collection of number segments, you are supposed to ...
- Python简单计算数组元素平均值的方法示例
Python简单计算数组元素平均值的方法示例 本文实例讲述了Python简单计算数组元素平均值的方法.分享给大家供大家参考,具体如下: Python 环境:Python 2.7.12 x64 IDE ...
- 浏览器打印出一段unicode码,汉字无法正常显示
处理办法:http://tool.chinaz.com/tools/unicode.aspx:unicode转中文就可以啦
- rhel7免密登录问题
以前在做linux免密登录时只要执行:cat id_rsa.pub>> authorized_keys,就可以了 后来升级到rhel7之后不行,发现有两个需要改动: 1.修改ssh的配置文 ...
- react 生命周期函数的一些心得体会
一.理论 组件本质上是状态机,输入确定,输出一定确定 生命周期的三个阶段,三者时间是不固定的,只是在逻辑上的分类: 二.初始化阶段: getDefaultProps:获取实例的默认属性(即使没有生成实 ...
- PHP实现无限极分类的两种方式,递归和引用
面试的时候被问到无限极分类的设计和实现,比较常见的做法是在建表的时候,增加一个PID字段用来区别自己所属的分类 $array = array( array('id' => 1, 'pid' =& ...
- Java中让fastJson识别Colloction和Map中的泛型类
由于fastJson的高效性,最近采用fastJson来做序列化并存储数据,但出现了一个麻烦的问题,如果将Map<K,V>这样的类型序列化,反序列化就会不尽人意,有以下尝试: 使用JSON ...