算法(插入、希尔、冒泡)

算法学习技巧
先问自己几个问题
什么是什么?
为什么要这么写?
稳定性?
时间复杂度?

冒泡排序
是什么:首先拿到第1个元素,和它第二个比较,较大的放右边;第二个与第三个比,一直重复下去 ,最后一个就是最大的数
为什么:总共有n个数,主要是控制轮数,第二个是控制次数。比的次数 为:n-1
稳定性
时间复杂度
方法一:
def Bubble(arr):
    for i in range(len(arr)):
        for j in range(len(arr)-1-i):
            if arr[j]>arr[j+1]:
                arr[j],arr[j+1]=arr[j+1],arr[j]
    return arr

arr=[9,3,6,2,0,6]
print(Bubble(arr))

>>> arr=[9,3,6,2,0,6]
>>> print(Bubble(arr))
[0, 2, 3, 6, 6, 9]

方法二:
def Bubble(arr):
    i=0
    while i<len(arr):
        print("当前为第%s轮"%i+"***********************************")
        for j in range(len(arr)-1-i):
            if arr[j]>arr[j+1]:
                arr[j],arr[j+1]=arr[j+1],arr[j]
                print("当前的值得为:",(arr[j],arr[j+1]))
        i+=1
    return arr

arr=[9,3,6,2,0,6]
print(Bubble(arr))

方法三:
def Bubble(arr):
    i=0
    while i<len(arr):
        print("当前为第%s轮"%(i+1)+"***********************************")
        j=len(arr)-1-i
        while j<i:
            if arr[j]>arr[j+1]:
                arr[j],arr[j+1]=arr[j+1],arr[j]
                #print("当前的值得为:",(arr[j],arr[j+1]))
                print("当前的数组为:",arr)
            j+=1
        i+=1
    return arr

arr=[9,3,6,2,0,6]
print(Bubble(arr))

>>> def Bubble(arr):
...     i=0
...     while i<len(arr):
...         print("当前为第%s轮"%(i+1)+"***********************************")
...         j=len(arr)-1-i
...         while j<i:
...             if arr[j]>arr[j+1]:
...                 arr[j],arr[j+1]=arr[j+1],arr[j]
...                 #print("当前的值得为:",(arr[j],arr[j+1]))
...                 print("当前的数组为:",arr)
...             j+=1
...         i+=1
...     return arr
...
>>> arr=[9,3,6,2,0,6]
>>> print(Bubble(arr))
当前为第1轮***********************************
当前为第2轮***********************************
当前为第3轮***********************************
当前为第4轮***********************************
当前的数组为: [9, 3, 2, 6, 0, 6]
当前为第5轮***********************************
当前的数组为: [9, 2, 3, 6, 0, 6]
当前的数组为: [9, 2, 3, 0, 6, 6]
当前为第6轮***********************************
当前的数组为: [2, 9, 3, 0, 6, 6]
当前的数组为: [2, 3, 9, 0, 6, 6]
当前的数组为: [2, 3, 0, 9, 6, 6]
当前的数组为: [2, 3, 0, 6, 9, 6]
当前的数组为: [2, 3, 0, 6, 6, 9]
[2, 3, 0, 6, 6, 9]
>>>
插入排序
方法一
def insertSort(arr):
    for i in range(1,len(arr)):
        for j in range(i,0,-1):
            if arr[j-1]>arr[j]:
                arr[j-1],arr[j]=arr[j],arr[j-1]
    return arr

arr=[9,3,6,2,0,6]
print(insertSort(arr))
...
>>> arr=[9,3,6,2,0,6]
>>> print(insertSort(arr))
[0, 2, 3, 6, 6, 9]
>>>

方法二
def insertSort(arr):
    for i in range(1,len(arr)):
        for j in range(0,i):
            if arr[j]>arr[i]:#这里j的位置比I要前面,因为i是从0开始
                arr[j],arr[i]=arr[i],arr[j]
    return arr

arr=[9,3,6,2,0,6]
print(insertSort(arr))
>>> arr=[9,3,6,2,0,6]
>>> print(insertSort(arr))
[0, 2, 3, 6, 6, 9]
>>>

方法三:
def insertSort(arr):
    i=1
    while i<len(arr):
        value=arr[i]
        j=i-1
        while j>=0:
            if arr[j]>value:#这里j的位置比I要前面,因为i是从0开始
                arr[j+1],arr[j]=arr[j],arr[j+1]
            j-=1
        i+=1
    return arr

arr=[9,3,6,2,0,6]
print(insertSort(arr))
>>> arr=[9,3,6,2,0,6]
>>> print(insertSort(arr))
[0, 2, 3, 6, 6, 9]

原文地址:https://www.cnblogs.com/hzyimen/p/12359492.html

时间: 2024-10-11 05:05:19

算法(插入、希尔、冒泡)的相关文章

python排序算法实现(冒泡、选择、插入)

python排序算法实现(冒泡.选择.插入) python 从小到大排序 1.冒泡排序: O(n2) s=[3,4,2,5,1,9] #count = 0 for i in range(len(s)): for j in range((i+1),len(s)): s[i],s[j]=min(s[i],s[j]),max(s[i],s[j]) #print count print s 2.选择排序: O(n2) s=[3,4,2,5,1,9] #count = 0 for i in range(l

python 数据结构与算法之排序(冒泡,选择,插入)

目录 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 数据结构与算法: 算法: 数据结构 冒泡排序法 选择排序法 插入排序法 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 计算机重要的几门课: 1.数据结构和算法 2.网络 3.操作系统 4.计算组成原理 数据结构与算法: 算法: 衡量算法的标准: 时间复杂度:就是程序代码执行的大概次数 小结: 时间复杂度是用来估计算法运行时间的一个式子(单位) 一般来说,时间复杂度高的算法比复杂度低的算法慢 常见的

排序算法之希尔排序

文章转载自http://www.cnblogs.com/chengxiao/ 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一.本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组

线性表算法-插入

线性表算法-插入

Java学习笔记——排序算法之希尔排序(Shell Sort)

落日楼头,断鸿声里,江南游子.把吴钩看了,栏杆拍遍,无人会,登临意. --水龙吟·登建康赏心亭 希尔算法是希尔(D.L.Shell)于1959年提出的一种排序算法.是第一个时间复杂度突破O(n2)的算法之一. 其基础是插入排序. 上代码: 1 public class ShellSort { 2 3 public static void shellSort(int[] arr){ 4 5 int increment = arr.length; 6 int temp;//牌 7 int i; 8

【数据结构与算法】希尔排序

希尔排序的时间复杂度是O(n^1.3)~O(n^2),空间复杂度是O(1). 代码如下: /** * 源码名称: ShellSort.java * 日期:2014-08-11 * 程序功能:希尔排序 * 版权:[email protected] * 作者:A2BGeek */ public class ShellSort { public void shellSort(int[] in) { int length = in.length; int span = length / 2; int i

算法----(6)希尔排序

希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一 1 def shellSort(nums): 2 # 设定步长 3 step = len(nums)//2 4 while step > 0: 5 for i in range(step, len(nums)): 6 # 类似插入排序, 当前值与指定步长之前的值比较, 符合条件则交换位置

五分钟学会一个高难度算法:希尔排序

前言 由于LeetCode上的算法题很多涉及到一些基础的数据结构,为了更好的理解后续更新的一些复杂题目的动画,推出一个新系列 ---<图解数据结构>,主要使用动画来描述常见的数据结构和算法.本系列包括十大排序.堆.队列.树.并查集.图等等大概几十篇. 希尔排序 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本.但希尔排序是非稳定排序算法.希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率: 但插入排序

经典排序算法之希尔排序

? 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一.希尔排序适合数据量中等情况,几十个到几万个. ? 网上看了好久才彻底明白希尔排序是什么,简单的说将就是按照步进对数据进行分组,对每组分别进行插入排序,直到步进是1的时候则全部完成.在此感谢 dreamcatcher-cx的博客 的讲解. function sortShell(arr)

1. 算法 -- 排序(插入,冒泡,希尔,快速,选择)

1.  插入排序===================================================== 算法思想简单描述: 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的.如此反复循环,直到全部排好顺序. 直接插入排序是稳定的.算法时间复杂度O(n2)--[n的平方] 一般来说,插入排序都采用in-place在数组上实现.具体算法描述如下:1.从第一个元素开始,该元素可以认为已经被排序