zoukankan      html  css  js  c++  java
  • 选择排序法&快速排序法

    选择排序法:每次遍历整个数组,选出其中最小值。如果数组长度为n,则需要(n-1)+(n-2)+...+2+1次操作,则用大O表示法表示应该为O(n*n/2),但是大O表示法省略诸如1/2这样的常数,因此该方法的大O表示为O(n^2)。

    Python代码:

    >>> def findSmallest(arr):
        smallest = arr[0]
        smallest_index = 0
        for i in range(1, len(arr)):
            if arr[i] < smallest:
                smallest = arr[i]
                smallest_index = i
        return smallest_index
    
    >>> def selectionSort(arr):
        newArr = []
        for i in range(len(arr)):
            smallest = findSmallest(arr)
            newArr.append(arr.pop(smallest))
        return newArr

    测试:

    >>> selectionSort([5,3,6,2,10])
    [2, 3, 5, 6, 10]
    >>> 

    C#代码:

    namespace Algorithms
    {
        public static class SelectionSort
        {
            public static List<double> Selection_Sort(List<double> list)
            {
                List<double> newList = new List<double>();
                double smallest;
                int count = list.Count;
                for (int i = 0; i < count; i++)
                {
                    smallest = list[FindSmallest(list)];
                    list.Remove(smallest);
                    newList.Add(smallest);
                }
                return newList;
            }
    
            private static int FindSmallest(List<double> list)
            {
                double smallest = list[0];
                int smallest_index = 0;
                for (int i = 1; i < list.Count; i++)
                {
                    if(list[i] < smallest)
                    {
                        smallest = list[i];
                        smallest_index = i;
                    }
                }
                return smallest_index;
            }
        }
    }

    快速排序法:请先熟悉“递归”的相关知识。https://www.cnblogs.com/larissa-0464/p/10630300.html

    分而治之(divide and conquer, D&C)的思想:1.找出简单的基线条件;2.确定如何缩小问题的规模,使其符合基线条件。

    那么将D&C思想应用于排序任务中,其思路应如下:

    基线条件就是只有一个元素的数组,这样的数组顺序就是自己。在数组中任取一个元素作为基准值,那么该数组将会被划分为三部分

      小于基准值的子数组 + 基准值 + 大于基准值的子数组

    这样就会不断地缩小数组的规模,直到只剩一个元素为止。

    Python代码:

    >>> def quicksort(arr):
        if len(arr) < 2:
            return arr
        else:
            pivot = arr[0]
            less = [i for i in arr[1:] if i <= pivot]
            greater = [i for i in arr[1:] if i > pivot]
            return quicksort(less) + [pivot] + quicksort(greater)
    
        
    >>> arr = [3,5,1,9,7]
    >>> quicksort(arr)
    [1, 3, 5, 7, 9]
    >>> 

    C#代码:

    namespace Algorithms
    {
        public static class QuickSort
        {
            public static List<double> Quick_Sort(List<double> array)
            {
                if (array.Count < 2)
                    return array;
                else
                {
                    double pivot = array[0];
                    List<double> less = new List<double>();
                    List<double> greater = new List<double>();
                    for (int i = 1; i < array.Count; i++)
                    {
                        if (array[i] <= pivot)
                            less.Add(array[i]);
                        else
                            greater.Add(array[i]);
                    }
                    return Quick_Sort(less).Union(new List<double>() { pivot }).Union(Quick_Sort(greater)).ToList();
                }
            }
        }
    }

     其实,排序的方法已经包含在各种语言中了,比如Python和C#都是使用Sort方法,就可以对一个数组进行从小到大的排序了。不过了解算法的本质应该也不是什么坏事吧。

  • 相关阅读:
    php 7.1 openssl_decrypt() 代替 mcrypt_module_open() 方法
    关于Http_build_query的用法
    git fetch 和git pull 的差别
    PhpStorm 头部注释、类注释和函数注释的设置
    输出信息log4j.properties的作用与使用方法
    字段设置ALV中下拉列表列的实现
    遍历中序C语言实现二叉树的递归遍历与非递归遍历
    搜索中文Solr Analysis And Solr Query Solr分析以及查询
    记忆指向指针常量 常量指针 常量指针常量
    匹配位置KMP算法深入浅出
  • 原文地址:https://www.cnblogs.com/larissa-0464/p/10624203.html
Copyright © 2011-2022 走看看