zoukankan      html  css  js  c++  java
  • 排序(冒泡,选择,插入,快速)

    排序

    冒泡排序

    func BubbleSort(s []int)[]int{
    	for i := 0; i < len(s); i ++ {
    		for j := i + 1; j < len(s); j ++{
    			if s[i] > s[j]{
    				s[i],s[j] = s[j],s[i]
    			}
    		}
    	}
    	return s
    }
    

    选择排序

    选择是排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,经过和其他元素重整,再依原则交换位置后达到排序目的。

    第一次从R[0]-R[n-1]中选出最小值,与R[0]交换,第二次从R[1]-R[n-1]中选取最小值,与R[1]交换,第三次从R[2]-R[n-1]中选取最小值,与R[2]交换,...,第i次从R[i-1]-R[n-1]中选取最小值,与R[i-1]进行交换,...,第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排序的有序序列。

    func SelectSort(s []int)[]int{
    	for i := 0; i < len(s) - 1; i ++ {
    		// 先假设arr[0]为最小值
    		min := s[i]
    		minIndex := i
    
    		// 遍历后面1—[len(s)-1]比较
    		for j := i + 1; j < len(s); j ++ {
    			if min > s[j] {
    				// 找到真正的最大值
    				min = s[j]
    				minIndex = j
    			}
    		}
    		// 交换操作
    		if minIndex != i {
    			s[i], s[minIndex] = s[minIndex],s[i]
    		}
    	}
    	return s
    }
    

    插入排序

    插入式排序也属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。

    把n个待排序的元素看成为一个有序表和一个无需表,开始时,有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码一次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。

    func InsertSort(s []int)[]int{
    	// 完成第一次,给第二个元素找到合适的位置并插入
    	for i := 1; i < len(s); i ++ {
    		insertVal := s[i]
    		insertIndex := i - 1
    
    		// 从小到大
    		for insertIndex >= 0 && s[insertIndex] > insertVal{
    			s[insertIndex + 1] = s[insertIndex]
    			insertIndex --
    		}
    		// 插入
    		if insertIndex + 1 != i {
    			s[insertIndex + 1] = insertVal
    		}
    	}
    
    	return s
    }
    

    快速排序

    快速排序是对冒泡排序的一种改进,基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据编程有序序列。

    // left 表示数组左边的下标
    // right 表示数组右边的下标
    // array B小时要排序的数组
    func QuickSort(left, right int, s []int){
    	l := left
    	r := right
    	// p 是中轴,支点
    	p := s[(l+r)/2]
    
    	//for循环的目的是将比p小的数放到左边,比p大的数放到右边
    	for; l < r;{
    		// 从p的左边找到大于等于p的值
    		for;s[l] < p;{
    			l ++
    		}
    		// 从p的右边找到小于p的值
    		for;s[r] > p;{
    			r --
    		}
    		// l >= r 表明本次分解任务完成,break
    		if l >= r {
    			break
    		}
    		// 交换
    		s[l],s[r] = s[r],s[l]
    
    		// 优化
    		if s[l] == p {
    			r --
    		}
    		if s[r] == p {
    			l ++
    		}
    	}
    	// 如果l == r, 再移动下
    	if l == r{
    		l ++
    		r --
    	}
    	// 向左递归
    	if left < r{
    		QuickSort(left,r, s)
    	}
    	// 向右递归
    	if right > l {
    		QuickSort(l,right,s)
    	}
    }
    
  • 相关阅读:
    [Javascript]发布一个自己写的日期控件:DateTimeList
    Oracle PL/SQL 编程手册(SQL大全)
    [乱七八糟][转]程序版吉祥三宝
    [乱七八糟][转]这不是你想象中的软件产业
    [随文杂记]生男好还是生女好?
    [SqlServer]链接数据库存储过程
    [音乐天堂]辛德勒名单原声大碟
    [C#]WinFrom中的DataGrid单击选择行
    [乱七八糟]《进化论——人类科学史上最大的谎言》
    [乱七八糟]《阿甘正传》点评
  • 原文地址:https://www.cnblogs.com/huiyichanmian/p/14463211.html
Copyright © 2011-2022 走看看