Go语言排序算法实现

// Algorithm project Algorithm.go
package Algorithm

// 冒泡排序
func BubbleSort(a []int) {
    n := len(a)
    for i := n; i > 1; i-- {
        for j := 0; j < i-1; j++ {
            if a[j] > a[j+1] {
                a[j], a[j+1] = a[j+1], a[j]
            }
        }
    }
}

// 选择排序
func SelectSort(a []int) {
    n := len(a)
    for i := 0; i < n-1; i++ {
        k := i
        for j := i + 1; j < n; j++ {
            if a[j] < a[k] {
                k = j
            }
        }
        a[i], a[k] = a[k], a[i]
    }
}

// 插入排序
func InsertionSort(a []int) {
    n := len(a)
    for i := 1; i < n; i++ {
        temp := a[i]
        j := i - 1
        for ; j >= 0 && a[j] > temp; j-- {
            a[j+1] = a[j]
        }
        a[j+1] = temp
    }
}

// 希尔排序
func ShellSort(a []int) {
    n := len(a)
    for d := n / 2; d >= 1; d /= 2 {
        for i := d; i < n; i++ {
            temp := a[i]
            j := i - d
            for ; j >= 0 && a[j] > temp; j -= d {
                a[j+d] = a[j]
            }
            a[j+d] = temp
        }
    }
}

// 快速排序的一次划分
func partition(a []int, s int, e int) int {
    temp := a[s]
    i := s
    j := e
    for i < j {
        for i < j && a[j] > temp {
            j--
        }
        if i < j {
            a[i] = a[j]
            i++
        }
        for i < j && a[i] < temp {
            i++
        }
        if i < j {
            a[j] = a[i]
            j--
        }
    }
    a[i] = temp
    return i
}

// 快速排序
func QuickSort(a []int, s int, e int) {
    if s >= e {
        return
    }
    i := partition(a, s, e)
    QuickSort(a, s, i-1)
    QuickSort(a, i+1, e)
}

// 堆排序
func HeapSort(a []int) {
    n := len(a)
    // 建堆
    for i := n/2 - 1; i >= 0; i-- {
        k := i
        for 2*k+1 < n {
            j := 2*k + 1
            if j+1 < n && a[j] < a[j+1] {
                j++
            }
            if a[j] > a[k] {
                a[k], a[j] = a[j], a[k]
                k = j
            } else {
                break
            }
        }
    }
    // 调整堆
    for i := n - 1; i > 0; i-- {
        a[0], a[i] = a[i], a[0]
        k := 0
        for 2*k+1 < i {
            j := 2*k + 1
            if j+1 < i && a[j] < a[j+1] {
                j++
            }
            if a[j] > a[k] {
                a[k], a[j] = a[j], a[k]
                k = j
            } else {
                break
            }
        }
    }
}

// 合并一次
func mergeOne(a []int, b []int, n int, len int) {
    i := 0
    for i+len < n {
        j := i + 2*len - 1
        if j >= n {
            j = n - 1
        }
        m := i
        k := i
        l := i + len
        for i < k+len && l <= j {
            if a[i] <= a[l] {
                b[m] = a[i]
                m++
                i++
            } else {
                b[m] = a[l]
                m++
                l++
            }
        }
        for i < k+len {
            b[m] = a[i]
            m++
            i++
        }
        for l <= j {
            b[m] = a[l]
            m++
            l++
        }
        i = j + 1
    }
    if i < n {
        for ; i < n; i++ {
            b[i] = a[i]
        }
    }
}

// 归并排序
func MergeSort(a []int) {
    n := len(a)
    b := make([]int, n)
    len := 1
    flag := 0
    for len < n {
        if flag == 0 {
            mergeOne(a, b, n, len)
        }
        if flag == 1 {
            mergeOne(b, a, n, len)
        }
        flag = 1 - flag
        len *= 2
    }
    if flag == 1 {
        for i := 0; i < n; i++ {
            a[i] = b[i]
        }
    }
}

github链接地址:https://github.com/gaopeng527/go_Algorithm/blob/master/sort.go

时间: 2024-10-17 11:26:38

Go语言排序算法实现的相关文章

杂文 - [1.1]使用库语言排序算法

[1.1]使用库语言排序算法 本文地址: http://blog.csdn.net/caroline_wendy 如果不缺少内存, 可以直接使用库的排序算法. 使用库语言的排序程序: C语言性能最好的算法是快速排序(quick sort). C++性能最好的是集合(set)的排序算法. C语言代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <std

C语言排序算法总结

学计算机程序设计的应该都知道,算法是程序之魂.所谓算法,就是解决问题的方法加上有限的实现步骤.算法的特点有有穷性,确定性,有效性,有零个或多个输入,有一个或多个输出.下面我们就来简单总结一下C语言中的三种经典排序算法. 一.冒泡算法. 所谓冒泡排序法,就是对一组数字进行从大到小或从小到大排序的一种算法.具体方法是,相邻的数字两两交换.从第一个数值开始,如果相邻两个数的排列顺序与我们的期望不相同,则将两个数的位置进行交换(对调):如果其余我们期望的相同,则不交换位置.重复这样的过程,一直到最后没有

C语言排序算法复习

排序算法有很多种,这里在复习和分析的基础上,做一个自己的总结: 首先要知道有哪些排序算法,google一下,有云C语言7大经典排序算法(也有8大).主要包括冒泡排序,快速排序,选择排序,插入排序,希尔排序,归并排序,堆排序,8大的还有基数排序.各有各的版本,代码写法也各不相同.所以这里以整理思路为先,代码只是作为自己的一个备份. 搞清楚的概念:稳定排序和不稳定排序,就看序列中两个值相等的数,排完序之后的相对位置是否改变,如果改变了就不稳定. 内部排序和外部排序,只用到内存即可完成排序的就叫内部排

C语言排序算法之简单交换法排序,直接选择排序,冒泡排序

C语言排序算法之简单交换法排序,直接选择排序,冒泡排序,最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 简单交换法排序 1 /*简单交换法排序 2 根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置 3 交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动 4 不稳定 5 */ 6 #include<windows.h> 7 #include<stdio.h> 8 void main(){ 9 int i,j,arr[10

c语言排序算法

用C语言总结一下常用排序算法,虽然大多数语言里已经提供了排序算法,比如C函数库中提供了qsort排序函数(内部为快速排序实现),但理解排序算法的思想的意义远远超过了实用的价值.这里我总结了常用的排序算法,并用C语言实现.这些算法的书写顺序也有一定的关联,比如希尔排序是对插入算法的改进,快速排序是对冒泡排序的改进,快速排序和归并排序都用递归实现.注:每种方法的实现尽量提供了相同的形参列表.这里并没用涉及堆排序,箱排序等算法的实现. 插入排序算法概要:插入排序依据遍历到第N个元素的时候前面的N-1个

C语言 排序算法 - 数据结构学习笔记

/**  功能:     排序   *日期:     2017年9月24日   *作者:     yzh   *开发环境:  QT   **/ #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_STACK_LENGTH 100     //非递归快速排序调用栈 #define MAX_LENGTH 20            //数组最大值 //对于数值型 keyType #de

C语言排序算法——简单选择排序算法

冒泡排序算法的思想是不断的交换,通过交换完成最终的排序. 选择排序的基本思想是每一趟在n-i+1个记录中选取最小的记录,作为第i个的记录. 1 void SimpleSelectSort(int *p) 2 { 3 int i,j,min; 4 for(i=0;i<10;i++) 5 { 6 min=i;    //将当前下标定义为最小下标 7 for(j=i+1;j<10;j++) 8 { 9 if(p[min>p[j]])    //如果有小于当前最小值的 10 { 11 min=j

【算法】C语言排序算法整理

/** * 快速排序算法 */ void quick_sort (int *s, int l, int r) { if (l < r) { int i = l, j = r, x = s[l]; while (i < j) { while (i < j && s[j] >= x) j--; if (i < j) s[i++] = s[j]; while (i < j && s[i] < x) i++; if (i < j) s

两种常用的C语言排序算法

1. 要求输入10个整数,从大到小排序输出 输入:2 0 3 -4 8 9 5 1 7 6 输出:9 8 7 6 5 3 2 1 0 -4 解决方法:选择排序法 实现代码如下: #include <stdio.h> int main(int argc, const char * argv[]) { int num[10],i,j,k,l,temp; //用一个数组保存输入的数据 for(i=0;i<=9;i++) { scanf("%d",&num[i]);