关于Python排序算法-快速排序(Quick Sort)

#coding=utf-8

# 快速排序
'''
快速排序算法的原理如下:
在待排序的元素任取一个元素作为基准(通常选第一个元素,但最的选择方法是从待排序元素中随机选取一个作为基准),称为基准元素;
将待排序的元素进行分区,比基准元素大的元素放在它的右边,比其小的放在它的左边;
对左右两个分区重复以上步骤直到所有元素都是有序的。
'''
def part(li, left, right):  # 列表,最左索引,最右索引
    key = li[left]  # 把第一个元素作为基准元素
    print("1:key=%s, left=%s, right=%s, li=%s" % (key, left, right, li) )
    while left < right:  # 当最左小于最右
        # 从右往左扫描,找到第一个比基准元素小的元素
        while right > left and li[right] >= key:
            right -= 1
        # 找到这个元素li[right]后,放入li[left]
        li[left] = li[right]

        print("2.1:left=%s-right=%s-%s" % (left, right, li) )
        # 从左往右扫描,找到第一个比基准元素大的元素
        while left < right and li[left] <= key:
            left += 1
        # 找到这个元素li[left]后,放入li[right]
        li[right] = li[left]

        print("2.2:left=%s-right=%s-%s" % (left, right, li) )

    # 基准元素归位
    li[left] = key
    print("3:key=%s, left=%s, li[%s]=%s, li=%s" % (key, left, left, li[left], li) )
    return left  # 返回当前基准元素的索引


def quick_sort(li, left, right):
   if left < right:  # 如果左索引<右索引
       mid = part(li, left, right)    # 调用part进行分区 返回一个索引赋给mid
       quick_sort(li, left, mid - 1)  # 基准元素左边的元素进行递归排序
       quick_sort(li, mid + 1, right) # 基准元素右边的进行递归排序

import random
# range()函数中有一个参数,则从0开始。
# range()函数中有两个参数,则将第一个参数做为起始位,第二个参数为结束位
li = list(range(9))

#print(li)
# 将序列的所有元素随机排序
random.shuffle(li)

print("排序准备%s" % li)

quick_sort(li, 0, len(li) - 1)
print("排序结果%s" % li)

排序准备[6, 5, 7, 3, 1, 0, 8, 4, 2]
1:key=6, left=0, right=8, li=[6, 5, 7, 3, 1, 0, 8, 4, 2]
2.1:left=0-right=8-[2, 5, 7, 3, 1, 0, 8, 4, 2]
2.2:left=2-right=8-[2, 5, 7, 3, 1, 0, 8, 4, 7]
2.1:left=2-right=7-[2, 5, 4, 3, 1, 0, 8, 4, 7]
2.2:left=6-right=7-[2, 5, 4, 3, 1, 0, 8, 8, 7]
2.1:left=6-right=6-[2, 5, 4, 3, 1, 0, 8, 8, 7]
2.2:left=6-right=6-[2, 5, 4, 3, 1, 0, 8, 8, 7]
3:key=6, left=6, li[6]=6, li=[2, 5, 4, 3, 1, 0, 6, 8, 7]
1:key=2, left=0, right=5, li=[2, 5, 4, 3, 1, 0, 6, 8, 7]
2.1:left=0-right=5-[0, 5, 4, 3, 1, 0, 6, 8, 7]
2.2:left=1-right=5-[0, 5, 4, 3, 1, 5, 6, 8, 7]
2.1:left=1-right=4-[0, 1, 4, 3, 1, 5, 6, 8, 7]
2.2:left=2-right=4-[0, 1, 4, 3, 4, 5, 6, 8, 7]
2.1:left=2-right=2-[0, 1, 4, 3, 4, 5, 6, 8, 7]
2.2:left=2-right=2-[0, 1, 4, 3, 4, 5, 6, 8, 7]
3:key=2, left=2, li[2]=2, li=[0, 1, 2, 3, 4, 5, 6, 8, 7]
1:key=0, left=0, right=1, li=[0, 1, 2, 3, 4, 5, 6, 8, 7]
2.1:left=0-right=0-[0, 1, 2, 3, 4, 5, 6, 8, 7]
2.2:left=0-right=0-[0, 1, 2, 3, 4, 5, 6, 8, 7]
3:key=0, left=0, li[0]=0, li=[0, 1, 2, 3, 4, 5, 6, 8, 7]
1:key=3, left=3, right=5, li=[0, 1, 2, 3, 4, 5, 6, 8, 7]
2.1:left=3-right=3-[0, 1, 2, 3, 4, 5, 6, 8, 7]
2.2:left=3-right=3-[0, 1, 2, 3, 4, 5, 6, 8, 7]
3:key=3, left=3, li[3]=3, li=[0, 1, 2, 3, 4, 5, 6, 8, 7]
1:key=4, left=4, right=5, li=[0, 1, 2, 3, 4, 5, 6, 8, 7]
2.1:left=4-right=4-[0, 1, 2, 3, 4, 5, 6, 8, 7]
2.2:left=4-right=4-[0, 1, 2, 3, 4, 5, 6, 8, 7]
3:key=4, left=4, li[4]=4, li=[0, 1, 2, 3, 4, 5, 6, 8, 7]
1:key=8, left=7, right=8, li=[0, 1, 2, 3, 4, 5, 6, 8, 7]
2.1:left=7-right=8-[0, 1, 2, 3, 4, 5, 6, 7, 7]
2.2:left=8-right=8-[0, 1, 2, 3, 4, 5, 6, 7, 7]
3:key=8, left=8, li[8]=8, li=[0, 1, 2, 3, 4, 5, 6, 7, 8]
排序结果[0, 1, 2, 3, 4, 5, 6, 7, 8]

关于Python排序算法-直接插入排序(Insert Sort)

#coding=utf-8

# 插入排序
'''
直接插入排序算法的原理如下:
在要排序的一组数中,假设前面(i-1) [i>=2] 个数已经是排好顺序的,
现在要把第i个数插到前面的有序数中,使得这i个数也是排好顺序的,
如此反复循环,直到全部排好顺序。
'''

def insert_sort(li):
    for i in range(1, len(li)):
        print("第%s趟" % (i))
        key = li[i]
        j = i - 1
        while j >= 0:
            if li[j] > key:
                li[j+1] = li[j]
                li[j] = key
                print("比对%s" %(li))

            j -= 1


import random
# range()函数中有一个参数,则从0开始。
# range()函数中有两个参数,则将第一个参数做为起始位,第二个参数为结束位
li = list(range(9))

#print(li)
# 将序列的所有元素随机排序
random.shuffle(li)
print("排序准备%s" % li)

insert_sort(li)
print("排序结果%s" % li)

关于Python排序算法-选择排序(Select Sort)

#coding=utf-8

# 选择排序
'''
选择排序算法的原理如下:
对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用一个变量min_index来记住他的位置,
接着第二次比较,前面“后一个元素”现变成了“前一个元素”,
继续跟它的“后一个元素”进行比较如果后面的元素比他要小则用变量min_index记住它在数组中的位置(下标),
等到循环结束的时候,我们应该找到了最小的那个数的下标,然后进行判断,如果这个元素的下标不是第一个元素的下标,
就让第一个元素跟它交换一下值,这样就找到整个数组中最小的数。
然后找到数组中第二小的数,让它跟数组中第二个元素交换一下值,以此类推。
'''

def select_sort(li):
    for i in range(len(li)):
        # 第i趟开始时 无序区:li[i:]
        # 找无序区最小值,保存最小值的位置
        print("第%s趟" % (i + 1))
        min_index = i
        for j in range(i + 1, len(li)):
             if li[j] < li[min_index]:
                  min_index = j
                  print("min_index %s" %(j))

        li[min_index], li[i] = li[i], li[min_index]
        print("第%s次比对%s" %(j, li))

import random
# range()函数中有一个参数,则从0开始。
# range()函数中有两个参数,则将第一个参数做为起始位,第二个参数为结束位
li = list(range(9))

#print(li)
# 将序列的所有元素随机排序
random.shuffle(li)
print("排序准备%s" % li)

select_sort(li)
print("排序结果%s" % li)

关于Python排序算法-冒泡排序(Bubble Sort)

#coding=utf-8

# 冒泡排序

'''
冒泡排序算法的原理如下:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
'''

import random

def bubble_sort(li):
   for i in range(len(li) - 1): # i表示第几趟
       print("第%s趟" % (i + 1))
       for j in range(len(li) - i -1): # j表示列表下标
           if li[j] > li[j+1]:
               li[j], li[j+1] = li[j+1], li[j]
           print("第%s次比对%s" %(j + 1, li))

# range()函数中有一个参数,则从0开始。
# range()函数中有两个参数,则将第一个参数做为起始位,第二个参数为结束位
li = list(range(9))

#print(li)
# 将序列的所有元素随机排序
random.shuffle(li)
print("排序准备%s" % li)

bubble_sort(li)
print("排序结果%s" % li)

关于Python数组和矩阵的用法X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]

1、关于数组、矩阵的说明。
X[:,0] 取二维数组中第一维的所有数据。
X[:,1] 取二维数组中第二维的所有数据。
X[:,m:n] 取二维数组中第m维到第n-1维的所有数据。
X[:,:,0] 取三维矩阵中第一维的所有数据。
X[:,:,1] 取三维矩阵中第二维的所有数据。
X[:,:,m:n] 取三维矩阵中第m维到第n-1维的所有数据。

2、测试代码 阅读全文

关于Python多个返回值

Python多个返回值的例子:

#coding=utf-8

# 多个返回值
def cts_info():

    user_code = '9001'
    user_name = 'jzh'

    # 元组-可以包含多个数据,因此可以使用元组让函数一次返回多个值
    # 如果函数返回的类型是元组,小括号可以省略
    # return (user_code, user_name)
    return user_code, user_name

# 元组
result = cts_info()
print(result)

# 
print(result[0])
print(result[1])

# 如果函数返回的类型是元组,同时希望单独的处理元组中的元素
# 可以使用多个变量,一次接收函数的返回结果
# 注意:使用多个变量接收结果时,变量的个数应该和元组中元素的个数保持一致
gl_user_code, gl_user_name = cts_info()

print(gl_user_code)
print(gl_user_name)
阅读全文

关于Python网络编程Socket(套接字)

1、server.py

#coding=utf-8

# 测试Socket

import socket

server = socket.socket()             #初始化
ip_port = ('127.0.0.1', 8081)
server.bind(ip_port)                 #绑定ip和端口

server.listen(10)                    #监听,设置最大数量是10
print("开始等待接收客户端数据----")
while True:
    conn, addr = server.accept()     #获取客户端地址
    print(conn, addr)
    print("客户端来数据了")
    while True:
        data = conn.recv(1024)       #接收数据
        print("接受的数据:", data)
        if not data:
            print("客户端丢失")
            break
        conn.send(data)              #返回数据    

server.close()                       #关闭socket

2、client.py 阅读全文