go实现冒泡排序和快速排序

项目结构

冒泡排序算法,源文件bubblesort.go

package bubblesort

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

            if flag == true {
                break
            }
        }
    }
}

快速排序算法,源文件qsort.go

package qsort

// 快速排序
func quickSort(values []int, left, right int)  {
    temp := values[left] //第一个值
    p := left //第一个位置
    i, j := left, right //第一个位置和最后一个位置
    for i <= j {
        for j >= p && values[j] >= temp {
            j--
        }
        if j >= p {
            values[p] = values[j]
            p = j
        }
        if values[i] <= temp && i <= p {
            i++
        }
        if i <= p {
            values[p] = values[i]
            p = i
        }
    }
    values[p] = temp
    if p - left > 1 {
        quickSort(values, left, p - 1) //递归调用
    }
    if right - p > 1 {
        quickSort(values, p + 1, right) //递归调用
    }
}

func QuickSort(values []int)  {
    quickSort(values, 0 , len(values) - 1)
}

主文件main.go

package main

import (
    "flag"
    "os"
    "bufio"
    "io"
    "strconv"
    "time"
    "sorter/algorithms/qsort"
    "sorter/algorithms/bubblesort"
    "fmt"
)

var infile *string = flag.String("i","unsorted.dat","File  contains values of sorting")
var outfile *string = flag.String("o","sorted.dat","File to receive sorted values")
var algorithm *string = flag.String("a","qsort","Sort algorithm")

// 从文件读取值
func readValues(infile string) (values []int, err error){
    file, err := os.Open(infile)
    if err != nil {
        println("Failed to open the input file ", infile)
        return
    }
    defer file.Close()
    br := bufio.NewReader(file)
    values = make([]int, 0)
    for {
        line, isPrefix, err1 := br.ReadLine()
        if err1 != nil {
            if err1 != io.EOF {
                err = err1
            }
            break
        }
        if isPrefix {
            println("A too long line, seems unexpected.")
            return
        }
        str := string(line)//转换字符数组为字符串
        value, err1 := strconv.Atoi(str)
        if err1 != nil {
            err = err1
            return
        }
        values = append(values, value)
    }
    return
}

// 将值写入到文件中
func writeValues(values []int, outfile string) error {
    file, err := os.Create(outfile)
    if err != nil {
        println("Failed to create the ouput file ", outfile)
        return err
    }
    defer file.Close()

    for _, value := range values {
        str := strconv.Itoa(value)
        file.WriteString(str + "\n")
    }
    return nil
}

func main()  {
    flag.Parse()
    if infile != nil {
        println("infile =", *infile,"outfile=", *outfile, "algorithm =", *algorithm)
    }
    values, err := readValues(*infile)
    if err == nil {
        fmt.Println("Read values:%v", values)
        if err == nil {
            t1 := time.Now()
            switch *algorithm {
            case "qsort":
                qsort.QuickSort(values)
            case "bubblesort":
                bubblesort.BubbleSort(values)
            default:
                println("Sorting algorithm", *algorithm, "is either unknown or unsupported.")
            }
            t2 := time.Now()
            println("The sorting process conts", t2.Sub(t1), "to complete.")

            writeValues(values, *outfile)
        }
    }else{
        println(err)
    }
}

排序结果

原文地址:https://www.cnblogs.com/yxhblogs/p/8215415.html

时间: 2024-11-09 22:22:46

go实现冒泡排序和快速排序的相关文章

交换排序算法---冒泡排序与快速排序

本文介绍两种交换排序方法:冒泡排序.快速排序 冒泡排序 冒泡排序基本思想 每次遍历完序列都把最大(小)的元素放在最前面,然后再对剩下的序列重复前面的一个过程,每次遍历完之后待排序序列就少一个元素,当待排序序列减小为只有一个元素的时候排序就结束了.因此,复杂度在最坏的情况下是O(N ^2). 冒泡排序实现过程 将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡.根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘

内部排序算法(一):交换排序(冒泡排序,快速排序)

这是我的博文系列<内部排序算法>的第一篇.所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来.所谓内部排序,是指在排序过程中,若整个文件都是放在内存中处理,排序时不涉及数据的内.外存交换(外排序的定义则相反). 内部排序法按照策略可以划分为五类:插入排序.选择排序.交换排序.归并排序和分配排序.待排文件的存储方式采用顺序表(或直接用向量)作为存储结构(其他的存储结构还有以链表作为存储结构等). 在这个系列的博文中,我按照排序算法的给出,排序算法的分析(包括算法的时空复杂度

常用排序算法实现[交换排序之冒泡排序、快速排序]

相关知识 1. 稳定排序和非稳定排序: 稳定排序算法会依照相等的关键(换言之就是值)维持纪录的相对次序. 如果排序算法是稳定的,就是当有两个有相等关键的纪录R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前. 2. 内排序和外排序 在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序: 在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序. 3.算法分类 排序算法从理论上分为如下几类: (1) 交换排序法:

python 冒泡排序与快速排序 遇到的错误与问题

今天看了兄弟连php里面的冒泡排序与快速排序,想了下应该可以用python实现. 冒泡排序函数: def mysort(x): len1 = len(x) for i in range(len1-1,0,-1): for j in range(0,i): if x[j]>x[j+1]: x[j],x[j+1]=x[j+1],x[j] return x 第三行代码,是让i的值9到1,因为冒泡排序是大的数往后冒,当第二次循环时,最大的数已经在最后了,所以不需要在比较一次. 同理,第三次,只要让其比较

必知必会的冒泡排序和快速排序

前一篇给大家介绍了<优化的直接插入排序(二分查找插入排序,希尔排序)>,现在继续介绍其他排序算法 本博文介绍两个最常被提起的排序算法:冒泡排序和快速排序.冒泡排序是入门排序算法,思路比较常规,但确是最耗时的排序算法,所以听到冒泡排序笑一笑就好了,千万不要拿来装B.另一个是被誉为“20世纪最伟大的十大经典算法”的快速排序,以及针对数组特征进行优化的“随机快排”和“平衡快排”. 冒泡排序 (一)概念及实现 冒泡排序的原理:重复的遍历要排序的数组,每次遍历过程中从头至尾比较两个相邻的元素,若顺序错误

java 交换排序之(冒泡排序、快速排序)

2016年上班第一天,闲来无事,先写篇博文来结束今天.我们大家都知道java的排序算法很多,接下来我就先看看java最常用的几种排序算法的思想源码附上.(本文所有排序只针对值排序,关于对象排序问题待续.....) 1.插入排序(直接插入排序.二分法插入排序.表插入排序.shell排序) 2.选择排序(直接选择排序.堆排序) 3.交换排序(冒泡排序.快速排序) 4.分配排序(基数排序) 5.归并排序(内排序.外排序) 一.java冒泡排序实现(大家最喜欢也是最简单的排序算法,但是性能不是那么ok

[C#] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序

用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html  马桶排序 一.场景:期末考试完了,老师要将同学们的分数从高到低排序.假设班上有 5 名同学,分别考了 5 分.3 分.5 分.2 分和 8 分[满分:10 分],排序后的结果就是 8 5 5 3 2,现在,让我们先思考 10 分钟吧! 二.思路: (1)先创建一个数组 int scores[11],就有 scores[

常见排序算法实现(直接插入排序,冒泡排序,快速排序,建大选择排序)

常见的排序算法实现(直接插入排序,冒泡排序,快速排序,建大选择排序),还有几个下次写上. #include "stdio.h" #include "stdlib.h" #include "malloc.h" #include <iostream> using namespace std; #define N 10 void showArr(int a[]); void InsertSort(int a[]);    //直接插入排序

PHP描述冒泡排序和快速排序算法

使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组.使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组.写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数 1. 使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组function bubble_sort($array){ $count = count($array); if ($count <= 0) return false; for($i=0; $i<$count

冒泡排序,快速排序,归并排序,插入排序,希尔排序,堆排序,计数排序,桶排序,基数排序

选择排序,冒泡排序,快速排序,归并排序,插入排序,希尔排序,计数排序,桶排序,基数排序 以上是一些常用的排序算法. 选择排序 for(int i = 0; i < n; i++) { int minval = a[i]; int minid = i; for (int j = i+1; j < n; j++) { if (a[j] < minval) { minid = j; minval = a[j]; } } swap(a[i], a[minid]); } 最简单的就是选择排序,就是