Python实现数据结构与算法——排序

C语言源码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>

#define ELE_NUM 8

static void swap(int* a, int* b)
{
    int t = 0;
    t = *a;
    *a = *b;
    *b = t;
}

static void BubbleSort(int* array)
{
    int i;
    int j;
    for(i = 0; i < ELE_NUM - 1; i++) {
        for (j = ELE_NUM - 1; j > i; j--) {
            if (array[j - 1] > array[j]) {
                swap(&array[j - 1], &array[j]);
            }
        }
    }
}

static void SelectSort(int* array)
{
    int i;
    int j;
    int min_index = 0;
    for (i = 0; i < ELE_NUM - 1; i++) {
        min_index = i;
        for(j = i + 1; j < ELE_NUM; j++) {
            if (array[j] < array[min_index]) {
                min_index = j;
            }
        }
        if (min_index != i) {
            swap(&array[i], &array[min_index]);
        }
    }
}

static void InsertSort(int* array)
{
    int tmp = 0;
    int i;
    int j;
    for (i = 1; i < ELE_NUM; i++) {
        if (array[i] < array[i - 1]) {
            tmp = array[i];
        }
        j = i - 1;
        while (j >= 0 && array[j] > tmp) {
            array[j + 1] = array[j];
            j--;
        }
        array[j + 1] = tmp;
    }
}


static int FindPartition(int* array, int low, int high)
{
    int values = array[low];
    while (low < high && array[high] >= values) {
        high--;
    }
    swap(&array[low], &array[high]);
    while (low < high && array[low] <= values) {
        low++;
    }
    swap(&array[low], &array[high]);
    return low;
}

static void QuickSort(int* array, int low, int high)
{
    if (low < high) {
        int point = FindPartition(array, low, high);
        QuickSort(array, low, point - 1);
        QuickSort(array, point + 1, high);
    }
}

int main()
{
    int a[ELE_NUM] = {7, 4, 1, 2, 5, 6, 8, 3};
    BubbleSort(a);
    for (int i = 0; i < ELE_NUM; i++) {
        printf("Bubble, thr sorted array a[%d] is %d\n", i, a[i]);
    }

    int aa[ELE_NUM] = {9, 4, 1, 2, 5, 6, 8, 3};
    SelectSort(aa);
    for (int i = 0; i < ELE_NUM; i++) {
        printf("Select, thr sorted array aa[%d] is %d\n", i, aa[i]);
    }

    int aaa[ELE_NUM] = {10, 4, 1, 2, 5, 6, 8, 3};
    SelectSort(aaa);
    for (int i = 0; i < ELE_NUM; i++) {
        printf("Insert, thr sorted array aaa[%d] is %d\n", i, aaa[i]);
    }

    int low = 0;
    int high = ELE_NUM - 1;
    int aaaa[ELE_NUM] = {11, 4, 1, 2, 5, 6, 8, 3};
    SelectSort(aaaa);
    for (int i = 0; i < ELE_NUM; i++) {
        printf("Insert, thr sorted array aaaa[%d] is %d\n", i, aaaa[i]);
    }

    return 0;
}

1:冒泡排序:冒泡顾名思义从下往上。两两相邻元素比较进行排序。

时间复杂度:O(n^2),空间复杂度O(1)。稳定

def BubbleSort(s,n):
    #两层循环
    for i in range(n-1): #注意循环起始边界
        for j in range(i+1,n)[::-1]:#注意循环起始边界 j从i+1开始循环,[::-1]表示倒取(从下而上)
            if s[j-1]>s[j]: 
               s[j-1],s[j],=s[j],s[j-1] #交换
    return s

if __name__=='__main__': #测试函数
    s=[7,4,1,2,5,6,8,3]
    n=len(s)
    print(BUbble(s,n))

2:选择排序:选择出最小的进行交换。相较于冒泡排序效率要高一些

时间复杂度:O(n^2),空间复杂度O(1)。不稳定

def SelectSort(s,n):
    #两层循环
    for i in range(n-1): #注意循环起始边界
        min_label=i
        for j in range(i+1,n):#注意循环起始边界 j从i+1开始循环
            if s[j]<s[min_label]: #遍历选择出最小的min_label,更新min_label
                min_label=j

        if min_label!=i: #交换
               s[i],smin_label]=s[min_label],s[i]
    return s

if __name__=='__main__': #测试函数
    s=[7,4,1,2,5,6,8,3]
    n=len(s)
    print(SelectSort(s,n))

3:直接插入排序:找出当前不满足升序的值,放入缓冲区。指针后移找到其满足升序的位置。相当于找出待排序的数据,插在合适的位置。

时间复杂度:O(n^2),空间复杂度O(1)。稳定

def InsertSort(s,n):
    temp=0

    for i in range(1,n):
        if s[i]<s[i-1]: 
             temp=s[i] #不满足要求顺序的放入缓冲区,是待插入数据
        #找位置,插在当前元素之前

        j=i-1 
        while j>=0 and s[j]>=temp:
            s[j+1]=s[j] #元素向前添加
            j-=1 #位置递减 后移
        s[j+1]=temp #找到位置j,j是比temp小的,所以j+1为插入位置

    return s

if __name__=='__main__':
    s=[7,2,4,1,5,0,6,8,3,9]
    n=len(s)
    print(InsertSort(s,n))               
                

4:快速排序:每一趟找一个基准点,大的放在基准点的右面,小的放在基准点的左面。

时间复杂度:O(nlogn),空间复杂度O(nlogn)。稳定

#寻找基准点,找到后交换元素     
def Portation(s,low,high):

    point_value=s[low] #当取了基准点这个值就固定住了 客观上独立的一个用来比较的常数

    while low<high:
        while low<high and s[high]>=point_value: #过滤掉大于基准点的
            high-=1
        s[low],s[high]= s[high],s[low] #关键
        while low<high and s[low]<=point_value:#过滤掉小于基准点的
           low+=1
        s[low],s[high]= s[high],s[low] #关键

    return low #当low=high,while结束point=low

def QuickSort(s,low,high): #初始化的默认参数为low=0,high=len(s)-
    if low<high: #迭代截至条件
        point=Portation(s,low,high) #point是一个下标
        QuickSort(s,low,point-1) #递归寻找,比基准点小的放在右面 
        QuickSort(s,point+1,high)#递归寻找,比基准点大的放在左面 
    return s #注意这里返回原序列
    
if __name__ == '__main__':
    a = [4, 7, 8, 3, 5, 9]
    low=0
    high=len(a)-1
    print(QuickSort(a,low,high))




       

5:归并排序:归并就是合并。就是将原序列拆分,之后合并

时间复杂度:O(nlogn),空间复杂度O(n)。稳定

def MergerSort(s): #二路拆分
    size=len(s)
    if size>1:#递归截至条件

        mid=size//2
        s1=s[0:mid] 
        s2=s[mid:size]

        MergerSort(s1) #递归拆分 
        MergerSort(s2) #递归拆分
       
        return Merge(s1,s2)#合并

    else: 
        return s #注意这里必须要有返回值,否则无法退出,且返回值为s
        
        
def Merge(s1,s2): #归并排序
    size1=len(s1)
    size2=len(s2)
    
    res=[]
    i,j=0,0
    while i<size1 and j<size2:
        if s1[i]<s2[j]:
            res.append(s1[i])
            i+=1
        else:
            res.append(s2[j])
            j+=1
            
    while i<size1: 
        res.append(s1[i])
        i+=1
    while j<size2:
        res.append(s2[j])
        j+=1
        
    return res

if __name__ == '__main__':
    a = [4, 7, 8, 3, 5, 9]
    print(MergerSort(a))

6:堆排序:利用完全二叉树的数据结构实现数组元素的排序。最大堆:父亲>孩子;最小堆:父亲<孩子;

算法步骤:

1:初始化建立一个最大堆。

数组大小为n,则需要进行n次完全二叉树的调整来满足最大堆的要求。在调整过程中我们一般从数组最后一个元素开始

2:交换堆顶元素和数组中的最后一个元素;之后去除最后一个元素(当前最大值),对剩下的数组进行堆的调整,之后进行交换。依次重复上述过程。

# -*- coding: utf-8 -*-
"""
Created on Wed Sep  4 15:43:51 2019

@author: Melo.qi

堆排序
"""
#完全二叉树的调整
def heapify(arr, n, i): 
    largest = i  
    l = 2 * i + 1     # left = 2*i + 1 
    r = 2 * i + 2     # right = 2*i + 2 
  
    if l < n and arr[i] < arr[l]: 
        largest = l 
  
    if r < n and arr[largest] < arr[r]: 
        largest = r 
  
    if largest != i: 
        arr[i],arr[largest] = arr[largest],arr[i]  # 交换
        heapify(arr, n, largest) 
  
def heapSort(arr): 
    n = len(arr) 
  
    # 创建一个最大堆
    for i in range(n, -1, -1): #从数组末尾开始
        heapify(arr, n, i) #进行调整
  
    # 一个个交换元素
    for i in range(0,n): 
        arr[n-i-1], arr[0] = arr[0], arr[n-i-1]   #数组末尾和堆顶交换
        heapify(arr, n-i-1, 0) #剩下部分进行调整
  
arr = [ 12, 14, 13, 8, 6, 2] 
heapSort(arr) 
n = len(arr) 
for i in range(n): 
    print ("%d" %arr[i])

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值