十大排序算法及其实现(C++ & Python)

AI虚拟人物 数字人直播,不用出镜,不用露脸的直播方式(附教程 软件) 我们先来看一组数据,这是我通过蝉妈妈查到的某位虚拟主播的一个带货数据,粉丝还不到 3000 人,每次直播 1 到 4 个小时,30天的总销量达到了1200单,15天,总销售额 2 万,可能相对来说客单价还是比较低,最关键的是才直播了 6 场,如果说他能够一个月直播 20 天,每天花 4个小时去直播,当个副业来做,就可以达到最起码月入 3 万的一个收入水平,我个人觉得是非常的不错的。大家把商品图片放在背景,只要场景设置的不错,场景和产品的关联度高,直播的时候挂上购买链接也会有一定的成交。 阅读详情

作者: 大树先生
博客: http://blog.youkuaiyun.com/koala_tree
知乎:https://www.zhihu.com/people/dashuxiansheng
GitHub:https://github.com/MrLeeTree
2018 年 4 月 16 日


经典的几大排序算法,网上各种版本代码质量层次不齐。在此想自己做个总结,一方面希望通过这次总结加深自己对几种排序算法的认识和记忆,另一方面也希望能写下来与大家分享。

每个算法力求给出普通解法和最优解法,当前部分排序算法还没有给出最优解,待后续的更新和补充。


排序算法说明

1. 算法优劣说明

稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;
不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;

时间复杂度: 一个算法执行所耗费的时间;
空间复杂度: 运行完一个程序所需内存的大小。

2. 排序算法总结

排序算法平均时间复杂度最好情况最坏情况空间复杂度稳定性
冒泡排序 O ( n 2 ) O(n^2) O(n2) O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)稳定
插入排序 O ( n 2 ) O(n^2) O(n2) O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)稳定
shell排序 O ( n 1.3 ) O(n^{1.3}) O(n1.3) O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)不稳定
选择排序 O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( 1 ) O(1) O(1)不稳定
快速排序 O ( n log ⁡ n ) O(n\log n) O(nlogn) O ( n log ⁡ n ) O(n\log n) O(nlogn) O ( n 2 ) O(n^2) O(n2) O ( log ⁡ n ) O(\log n) O(logn)不稳定
归并排序 O ( n log ⁡ n ) O(n\log n) O(nlogn) O ( n log ⁡ n ) O(n\log n) O(nlogn) O ( n log ⁡ n ) O(n\log n) O(nlogn) O ( 1 ) O(1) O(1)稳定
堆排序 O ( n log ⁡ n ) O(n\log n) O(nlogn) O ( n log ⁡ n ) O(n\log n) O(nlogn) O ( n log ⁡ n ) O(n\log n) O(nlogn) O ( 1 ) O(1) O(1)不稳定
计数排序 O ( n + k ) O(n+k) O(n+k) O ( n + k ) O(n+k) O(n+k) O ( n + k ) O(n+k) O(n+k) O ( k ) O(k) O(k)稳定
桶排序 O ( n + k ) O(n+k) O(n+k) O ( n + k ) O(n+k) O(n+k) O ( n 2 ) O(n^2) O(n2) O ( n + k ) O(n+k) O(n+k)稳定
基数排序 O ( n × k ) O(n\times k) O(n×k) O ( n × k ) O(n\times k) O(n×k) O ( n × k ) O(n\times k) O(n×k) O ( n + k ) O(n+k) O(n+k)稳定
  • n – 数据规模
  • k --“桶”的个数

一、冒泡排序(Bubble Sort)

平均时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( 1 ) O(1) O(1)

1. 算法描述

  • (1) 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
  • (2) 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
  • (3) 针对所有的元素重复以上的步骤,除了最后一个;
  • (4) 重复步骤1~3,直到排序完成。

2. C++实现

2-1:基本实现

void BubbleSort(int arr[], int n)
{
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

2-2:升级版

  • 加入isSwap标志,如果某次比较没有发生交换,即说明了已经有序,后面就无须进行遍历了。
void BubbleSort(int arr[], int n)
{
    for (int i = 0; i < n - 1; i++) {
        bool isSwap = false; 
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                isSwap = true;
            }
        }
        
        if(!isSwap) return;
    }
}

2-3:升级版++

  • 在升级版本的基础上再增添情况:已经遍历出部分有序的序列后,那部分也不用进行遍历,也就是说:发生交换的地方之后的地方不用遍历。
  • 使用current 和 last 来分别记录当前交换位置和最后一次交换位置。
void BubbleSort(int arr[], int len){
    int i,temp;
    //记录位置,当前所在位置current和最后发生交换的地方last
    int current,last = len - 1;
    while(last > 0) {
        current = 0;
        for(i = 0;i < last;++i){
            if(arr[i] > arr[i+1]){
                temp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp;
                //记录当前的位置,如果没有发生交换current值即for循环初始化的0
                current = i;
            }
        }
        //若current = 0即已经没有可以交换的元素了,即已经有序了
        last = current;
    }
}

3. python实现

# 冒泡排序
def bubble_sort(lists):
    count = len(lists)
    for i in range(0, count):
        for j in range(i + 1, count):
            if lists[i] > lists[j]:
                lists[i], lists[j] = lists[j], lists[i]
    return lists

4. 动图

还在路上,稍等...

二、插入排序(Insertion Sort)

插入排序的基本原理通俗的来讲就是扑克牌原理,按照从大或者从小的顺序进行排序。

平均时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( 1 ) O(1) O(1)

1. 算法描述

一般来说,插入排序都采用 in-place 在数组上实现。

  • (1) 从第一个元素开始,该元素可以认为已经被排序;
  • (2) 取出下一个元素,在已经排序的元素序列中从后向前扫描;
  • (3) 如果该元素(已排序)大于新元素,将该元素移到下一位置;
  • (4) 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
  • (5) 将新元素插入到该位置后;
  • (6) 重复步骤2~5。

2. C++实现

void InsertSort(int arr[],int n){
    for (int i =1;i <= n;++i){
        for(int j = i;j > 0;--j){
            if(arr[j] < arr[j -1]){
                int temp = arr[j];
                arr[j] = arr[j - 1];
                arr[j - 1] = temp;
            }
        }
    }
}

3. python实现

def Insert_sort(lists):
    for i in range(1, len(lists)):
        key = lists[i]
        j = i - 1
        while j>=0 and lists[j]>key:
            lists[j+1] = lists[j]
            j = j - 1
        lists[j+1] = key
    return lists

4. 动图

还在路上,稍等...

三、希尔排序(Shell Sort)

希尔排序是插入排序的一种更高效的改进版本。
插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;
但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。

平均时间复杂度: O ( n 1.3 ) O(n^{1.3}) O(n1.3)
空间复杂度: O ( 1 ) O(1) O(1)

1. 算法描述

  • (1) 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
  • (2) 按增量序列个数k,对序列进行k 趟排序;
  • (3) 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

2. C++实现

void ShellSort(int array[]){
    int index = sizeof(array)/2;
    int temp=0;
    while(index>=1){
        for(int i=index;i<length;i++){
            for(int j=i-index;j>=0;j-=index){
                if(array[j]>array[j+index]){
                    temp = array[j];
                    array[j] = array[j+index];
                    array[j+index]=temp;
                }
            }
        }
        index = index/2;
    }

}

3. python实现

def shell_sort(list):
    n = len(list)
    # 初始步长
    gap = round(n / 2)
    while gap > 0:
        for i in range(gap, n):
            # 每个步长进行插入排序
            temp = list[i]
            j = i
            # 插入排序
            while j >= gap and list[j - gap] > temp:
                list[j] = list[j - gap]
                j -= gap
            list[j] = temp
        # 得到新的步长
        gap = round(gap / 2)
    return list

4. 动图

还在路上,稍等...

四、选择排序(Selection Sort)

平均时间复杂度: O ( n 2 ) O(n^{2}) O(n2)
空间复杂度: O ( 1 ) O(1) O(1)

1. 算法描述

  • (1) 初始状态:无序区为R[1…n],有序区为空;
  • (2) 第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1…i-1]和R(i…n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1…i]和R[i+1…n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区;
  • (3) n-1趟结束,数组有序化了。

2. C++实现

void SelectSort(int a[],int n)  
{  
    for(int i=0; i<n-1; i++)  
    {  
        int index=i;  //无序区的第一个元素
        for(int j=i+1; j<n; j++)  
            if(a[j]<a[index]) //寻找无序区内的最小值  
                index=j;
                
        if(index!=i) //把找到的最小值放到无序区的最前面  
        {  
            int tmp=a[index];  
            a[index]=a[i];  
            a[i]=tmp;  
        }  
    }  
}  

3. python实现

def selection_sort(list):
    n=len(list)
    for i in range (0,n):
        min = i
        for j in range(i+1,n):
            if list[j]<list[min]:
                min=j
        
        if min != i:
            list[min], list[i] = list[i], list[min]
    return list

4. 动图

还在路上,稍等...

五、快速排序(Quick Sort)

平均时间复杂度: O ( n log ⁡ n ) O(n\log n) O(nlogn)
空间复杂度: O ( log ⁡ n ) O(\log n) O(logn)

1. 算法描述

  • (1) 从数列中挑出一个元素,称为 “基准”(pivot);
  • (2) 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  • (3) 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

2. C++实现

void swap(int* data, int i, int j){
    if(i == j) return;
    int temp = data[i];
    data[i] = data[j];
    data[j] = temp;
}

// 分区操作
int partition(int data[], int length, int start, int end){
    if(data == nullptr || length <= 0 || start < 0 || end >= length)
        throw new std::exception("Invalid Parameter");

    int index = rand() % (end - start + 1) + start; // 随机选择基准
    swap(data, index, end);
    int small = start - 1;
    for(index = start; index < end; ++index){
        if(data[index] < data[end]){
            ++small;
            if(small != index)
                swap(data, small, index);
        }
    }

    ++small;
    swap(data, small, end);

    return small;
}


void quickSort(int data[], int length, int start, int end){
    if(start == end) return;

    int index = partition(data, length, start, end);
    if(index > start)
        quickSort(data, length, start, index-1);
    if(index < end)
        quickSort(data, length, index+1, end);
}

3. python实现

def quick_sort(list):
    less = []
    pivotList = []
    more = []
    
    # 递归出口
    if len(list) <= 1:
        return list
    else:
        # 将第一个值做为基准
        pivot = list[0]
        for i in list:
            # 比基准小的值放到less数列
            if i < pivot:
                less.append(i)
            # 比基准大的值放到more数列
            elif i > pivot:
                more.append(i)
            # 将和基准相同的值保存在基准数列
            else:
                pivotList.append(i)
        # 对less数列和more数列继续进行排序
        less = quick_sort(less)
        more = quick_sort(more)
        return less + pivotList + more

4. 动图

还在路上,稍等...

六、归并排序(Merge Sort)

平均时间复杂度: O ( n log ⁡ n ) O(n\log n) O(nlogn)
空间复杂度: O ( n ) O(n) O(n)

归并排序是利用分治的思想去实现元素的排序。

  • 分治法:将原问题分解为几个规模较小,但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。
  • 归并排序将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序,最后进行合并。

1. 算法描述

  • (1) 把长度为n的输入序列分成两个长度为n/2的子序列;
  • (2) 对这两个子序列分别采用归并排序;
  • (3) 将两个排序好的子序列合并成一个最终的排序序列。

2. C++实现

void Merge(int arr[], int reg[], int start, int end) {
    if (start >= end)return;
    int len = end - start, mid = (len >> 1) + start;

    //分成两部分
    int start1 = start, end1 = mid;
    int start2 = mid + 1, end2 = end;
    //然后合并
    Merge(arr, reg, start1, end1);
    Merge(arr, reg, start2, end2);


    int k = start;
    //两个序列一一比较,哪的序列的元素小就放进reg序列里面,然后位置+1再与另一个序列原来位置的元素比较
    //如此反复,可以把两个有序的序列合并成一个有序的序列
    while (start1 <= end1 && start2 <= end2)
        reg[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];

    //然后这里是分情况,如果arr2序列的已经全部都放进reg序列了然后跳出了循环
    //那就表示arr序列还有更大的元素(一个或多个)没有放进reg序列,所以这一步就是接着放
    while (start1 <= end1)
        reg[k++] = arr[start1++];

    //这一步和上面一样
    while (start2 <= end2)
        reg[k++] = arr[start2++];
    //把已经有序的reg序列放回arr序列中
    for (k = start; k <= end; k++)
        arr[k] = reg[k];
}

void MergeSort(int arr[], const int len) {
    //创建一个同样长度的序列,用于临时存放
    int  reg[len];
    Merge(arr, reg, 0, len - 1);
}

3. python实现

  • 在合并的时候,判断L和R是否为空,若其中之一如L为空,则将另外一个如R中剩余的部分添加到A的末尾.
def Merge(Left, Right):
    i, j = 0, 0
    results = []
    while i < len(Left) and j < len(Right): # 注意这里的循环判断条件,即为不添加哨兵的方式
        if Left[i] <= Right[j]:
            results.append(Left[i]) # error处,注意
            i += 1
        else:
            results.append(Right[j])
            j += 1
    results += Left[i:] # 这里使用Left[i:]不会报溢出错误的原因是,list切片超出范围为空:[]
    results += Right[j:]
    return results


def Merge_sort(lists):
    if len(lists) <= 1:
        return lists
    mid = len(lists) // 2
    left = Merge_sort(lists[:mid])
    right = Merge_sort(lists[mid:])
    return Merge(left, right)

4. 动图

还在路上,稍等...

七、堆排序(Heap Sort)

平均时间复杂度: O ( n log ⁡ n ) O(n\log n) O(nlogn)
空间复杂度: O ( n log ⁡ n ) O(n\log n) O(nlogn)

1. 算法描述

  • (1) 将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;
  • (2) 将堆顶元素R1与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];
  • (3) 由于交换后新的堆顶R1可能违反堆的性质,因此需要对当前无序区(R1,R2,……Rn-1)调整为新堆,然后再次将R1与无序区最后一个元素交换,得到新的无序区(R1,R2….Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。

2. C++实现

//堆排序
void HeapSort(int arr[],int len){
    int i;
    //初始化堆,从最后一个父节点开始
    for(i = len/2 - 1; i >= 0; --i){
        Heapify(arr,i,len);
    }
    //从堆中的取出最大的元素再调整堆
    for(i = len - 1;i > 0;--i){
        int temp = arr[i];
        arr[i] = arr[0];
        arr[0] = temp;
        //调整成堆
        Heapify(arr,0,i);
    }
}

void Heapify(int arr[], int first, int end){
    int father = first;
    int son = father * 2 + 1;
    while(son < end){
        if(son + 1 < end && arr[son] < arr[son+1]) ++son;
        //如果父节点大于子节点则表示调整完毕
        if(arr[father] > arr[son]) break;
        else {
         //不然就交换父节点和子节点的元素
            int temp = arr[father];
            arr[father] = arr[son];
            arr[son] = temp;
            //父和子节点变成下一个要比较的位置
            father = son;
            son = 2 * father + 1;
        }
    }
}

3. python实现


def heap_sort(list):
    # 创建最大堆
    for start in range((len(list) - 2) // 2, -1, -1):
        sift_down(list, start, len(list) - 1)

    # 堆排序
    for end in range(len(list) - 1, 0, -1):
        list[0], list[end] = list[end], list[0]
        sift_down(list, 0, end - 1)
    return list

# 最大堆调整
def sift_down(lst, start, end):
    root = start
    while True:
        child = 2 * root + 1
        if child > end:
            break
        if child + 1 <= end and lst[child] < lst[child + 1]:
            child += 1
        if lst[root] < lst[child]:
            lst[root], lst[child] = lst[child], lst[root]
            root = child
        else:
            break

4. 动图

还在路上,稍等...

八、计数排序(Counting Sort)

平均时间复杂度: O ( n + k ) O(n + k) O(n+k)
空间复杂度: O ( k ) O(k) O(k)

1. 算法描述

  • (1) 找出待排序的数组中最大和最小的元素;
  • (2) 统计数组中每个值为i的元素出现的次数,存入数组C的第i项;
  • (3) 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);
  • (4) 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1。

2. C++实现

//计数排序
int* countSort(int* A,int k,int n) //[0,k)范围内n个数
{
    int* tmp = new int[k];
    int* s = new int[n];
    memset(tmp, 0, sizeof(int) * k);
    for (int i = 0; i < n; i++) //原始数组中的计数
        tmp[A[i]]++;
    for (int i = 0; i < k - 1; i++) //记录不大于该数的数字个数
        tmp[i + 1] += tmp[i];
    for (int i = n - 1; i >= 0; i--) //逆序输出
        s[--tmp[A[i]]] = A[i]; //计数哈希数组-1即为应当对应的秩,用原数组的数赋值
    delete[] tmp;
    return s;
}

3. python实现

def count_sort(list):
    min = 2147483647
    max = 0
    # 取得最大值和最小值
    for x in list:
        if x < min:
            min = x
        if x > max:
            max = x
    # 创建数组C
    count = [0] * (max - min +1)
    for index in list:
        count[index - min] += 1
    index = 0
    # 填值
    for a in range(max - min+1):
        for c in range(count[a]):
            list[index] = a + min
            index += 1
    return list

4. 动图

还在路上,稍等...

九、桶排序(Bucket Sort)

平均时间复杂度: O ( n + k ) O(n + k ) O(n+k)
空间复杂度: O ( n + k ) O(n + k) O(n+k)

1. 算法描述

  • (1) 设置一个定量的数组当作空桶;
  • (2) 遍历输入数据,并且把数据一个一个放到对应的桶里去;
  • (3) 对每个不是空的桶进行排序;
  • (4) 从不是空的桶里把排好序的数据拼接起来。

2. C++实现

void bucketSort(vector<int>& vec)  
{  
    int length=vec.size();  
    vector<int> buckets(length,0);//准备一堆桶,容器的下标即待排序数组的键值或键值经过转化后的值  
    //此时每个桶中都是没有放值的,所以都是0  
  
    for(int i=0;i<length;++i)  
    {  
        buckets[vec[i]]++;//把每个值放入到对应的桶中  
    }  
      
    int index=0;  
    for(int i=0;i<length;++i)  
    {//把值取出,空桶则直接跳过  
        for(int j=0;j<buckets[i];j++)  
        {  
            vec[index++]=i;  
        }  
    }  
}  

3. python实现

def bucket(lst):
    buckets = [0] * ((max(lst) - min(lst))+1)
    for i in range(len(lst)):
        buckets[lst[i]-min(lst)] += 1
    res=[]
    for i in range(len(buckets)):
        if buckets[i] != 0:
            res += [i+min(lst)]*buckets[i]
    return res

4. 动图

还在路上,稍等...

十、基数排序(Radix Sort)

平均时间复杂度: O ( n × k ) O(n\times k) O(n×k)
空间复杂度: O ( n + k ) O(n+k) O(n+k)

1. 算法描述

  • (1) 取得数组中的最大数,并取得位数;
  • (2) arr为原始数组,从最低位开始取每个位组成radix数组;
  • (3) 对radix进行计数排序(利用计数排序适用于小范围数的特点)。

2. C++实现

void countSort(vector<int>& vec,int exp)  
{//计数排序  
    vector<int> range(10,0);  
  
    int length=vec.size();  
    vector<int> tmpVec(length,0);  
  
    for(int i=0;i<length;++i)  
    {  
        range[(vec[i]/exp)%10]++;  
    }  
  
    for(int i=1;i<range.size();++i)  
    {  
        range[i]+=range[i-1];//统计本应该出现的位置  
    }  
  
    for(int i=length-1;i>=0;--i)  
    {  
        tmpVec[range[(vec[i]/exp)%10]-1]=vec[i];  
        range[(vec[i]/exp)%10]--;  
    }  
    vec=tmpVec;  
}  
  
void radixSort(vector<int>& vec)  
{  
    int length=vec.size();  
    int max=-1;  
    for(int i=0;i<length;++i)  
    {//提取出最大值  
        if(vec[i]>max)  
            max=vec[i];  
    }  
      
    //提取每一位并进行比较,位数不足的高位补0  
    for(int exp=1;max/exp>0;exp*=10)  
        countSort(vec,exp);  
}  

3. python实现

import math
def radix_sort(lists, radix=10):
    k = int(math.ceil(math.log(max(lists), radix)))
    bucket = [[] for i in range(radix)]
    for i in range(1, k+1):
        for j in lists:
            bucket[j/(radix**(i-1)) % (radix**i)].append(j)
        del lists[:]
        for z in bucket:
            lists += z
            del z[:]
    return lists

4. 动图

还在路上,稍等...

  • 以上图片来自维基百科及网友总结。
杰理JL701N内置flash录音配置教程 本文详细介绍了内置Flash录音功能的配置方法。主要内容包括:1) 基础模式配置(开启音乐/录音模式、Flash录音宏定义);2) 录音参数设置(格式基准值、存储区域定义、容量配置);3) MP3编码特殊处理;4) 下载时的Flash格式化操作;5) 录音开关和播放接口的使用说明。配置过程涉及多个关键文件的修改,并强调存储容量的精确分配。 阅读详情

相关推荐

SAP 运费处理方式

从直接的处理方式上看,情况1/2/3可以将运费记账到物料成本中,但情况4/5/6是直接记账到成本对象中,具体是要体现在损益表中,还是要结转到物料成本中,可依据业务要求进行好处理。如果体现在损益表中,不需要多过多额外的操作,如果要体现在物料成本中心,则需要再进行一系列的处理,最终将金额结转到物料成本中。因为在创建采购订单时不知道具体运费,可以不维护运费,只需要维护材料价格。:创建采购订单时,运费是由供应商承担,很多时候是包含在材料报价中,这种情况不需要专门针对运费进行处理,材料价格中已包含运费。

weixin_44506537的博客 3371

各种排序算法C++(快排、归并、堆排序、冒泡、选择、插入,计数、桶排序)

这或许是东半球分析十大排序算法最好的一篇文章 十大经典排序算法动画与解析,看我就够了! 左神(JAVA) 冒泡排序 package basic_class_01; import java.util.Arrays; public class Code_00_BubbleSort { public static void bubbleSort(int[] arr) { if (arr == n...

人大神成长记2 454

正点原子RK3588 Android 12镜像构建实战:从环境配置到烧录验证全指南

本文提供了一份基于正点原子RK3588开发板的Android 12镜像构建全流程实战指南。内容涵盖从Ubuntu环境配置、SDK获取、编译内核与系统,到最终镜像打包与烧录验证的完整步骤,并分享了内核驱动定制与系统优化技巧,旨在帮助开发者高效完成瑞芯微RK3588平台的系统定制工作。

grass的博客 811

基本的五大排序算法

详细介绍五大基本排序算法,直接插入,希尔算法,选择算法,归并算法,和冒泡算法,并将此类进行比较,说明五大排序算法的效率

m0_74246469的博客 2733

Star CCM+中的物性参数(定值、多项式、查表)

仿真过程中我们一定会遇到设置物性参数的问题,对于固定的物性参数还好说,直接输入一个固定的值即可。但是对于冷却液、气体、两相流等,物性参数是随着温度或温度和压力变化的。此时就涉及到多项式和查表。首先创建物理连续体,选择计算模型。

2201_75375391的博客 2957

S32K144(14)ADC

1、简介 开发板S32K144+S32DS+JLINK,裸机版的程序编写 S32K14x包含两个12位ADC模块,ADC0和ADC1 应用程序可能需要ADC的连续采样(4K采样/秒),这可能对CPU有相当大的负载。虽然使用可编程延迟块(PDB)来触发ADC可能会减少一些CPU负载,但当ADC以非常高的速率采样或PDB被绕过时,ADC支持DMA请求功能以获得更高的性能。ADC可以在转换完成时触发DMA(通过DMA请求)。TRGMUX会根据不同的应用需求,使用软件为用户提供更灵活的DMA触发方案,例如,可

朗朗上口就行啦的博客 1万+

Python笔记 之基数排序(基于计数排序实现基数排序)

使用Python实现基数排序 利用计数排序的稳定性,基于对技术排序的修改和调用实现基数排序 计数排序 前提说明 基数排序要求待排序数组n个元素为d位数的正整数 算法的期望运行时间表示为 O(n) 伪算法 RADIX-SORT(A,d) for i=1 to d: use a stable sort to sort array A on digit i 算法 def radixSort(A,d): ‘’‘从最低有效位开始排序解决d位数的排序问题’‘’ for i in range(1

一起种梧桐吧的博客 387

海思MPP平台千兆以太网驱动集成与测试指南

千兆以太网(GE)是嵌入式视觉系统中音视频流传输与边缘控制的核心物理接口,其底层驱动需兼顾DMA高效调度、中断实时响应与PHY链路稳定性。在Linux嵌入式环境中,GE驱动通常基于net_device框架实现,并深度耦合于SoC专用媒体处理平台(如海思MPP),通过硬件抽象层(HAL)屏蔽寄存器操作,提供零拷贝、RGMII时序适配、描述符环管理等关键能力。技术价值体现在降低CPU负载、保障1080p@30fps实时推流、支持ONVIF/RTSP协议交互及固件远程升级。典型应用场景包括网络摄像机(IPC)、A

weixin_42599908的博客 89

排序方法实现

【代码】排序方法实现。

weixin_45825917的博客 146

68页|大型车企集团数字化转型汽车数字化信息系统平台规划方案

这份PPT文档提供了一个全面的汽车集团数字化转型规划方案,涵盖了项目目标、规划思路、实施关注点、解决方案建议以及合作优势等多个方面。

baidu_25525561的博客 1328

2025年12月11日 Coherent收发器下沉到数据中心:调研

技术可行性已基本具备。随着3nm DSP技术的成熟和Coherent-Lite等低功耗方案的推出,Coherent技术与IMDD的功耗差距在800G及以上速率节点快速缩小。特别是在1.6T及更高速率,两种技术的功耗开始趋于收敛。同时,通过系统级优化,如将DSP功能从可插拔模块转移到ASIC芯片,可实现30%以上的功耗降低。在成本方面,硅光技术的进步使得单通道硅光引擎BOM成本降至18美元,较2020年下降62%,逼近InP方案的经济临界点。光学系统机会丰富多样。

weixin_51184047的博客 1167

用C++实现十大经典排序算法

排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。

billy的博客 1万+

使用MATLAB求解二维顶盖驱动流问题的详细代码和说明

本文介绍了使用MATLAB求解二维顶盖驱动流问题的涡量-流函数方法。代码采用129×129网格,雷诺数Re=1000,通过迭代求解Navier-Stokes方程,包含流函数方程和涡量输运方程的离散求解。程序实现了边界条件处理、收敛性检查,并提供丰富后处理功能:流线图、涡量分布图、中心线速度曲线、矢量图和三维涡量可视化。计算结果可与Ghia等(1982)的经典数据进行验证。该代码完整展示了CFD问题的数值求解流程,包括参数设置、主循环计算和多种结果呈现方式,适用于流体力学教学和科研验证。

AI的内部世界的博客 225

十大排序——最全最详细,一文让你彻底搞懂

最全最详细,一文带你了解十大排序 Sort 写在前面 因为GitHub的主文档太长,不容易维护,所以建立子文档以辅助。 本篇内容是主文档中的排序部分的扩展。 注:本篇内容最早发布于GitHub中,如果你觉得我写得还行,记得给我Star或是Fork~~ 献给我的家人 作者 Three 领英 知乎 力扣 优快云 ???? ???? ???? 不积跬步,无以至千里;不积小流,无以成江海。 ???? Top 代表返回顶部 ???? 代表到文档末尾 如果你觉得我

Three3333333的博客 9万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

一文总结十大经典排序算法(思维导图 + 动图演示 + 代码实现 C/C++/Python + 致命吐槽)

冒泡排序 void Swap( ElementType *a, ElementType *b ){ ElementType t = *a; *a = *b; *b = t; } void BubbleSort(ElementType A[], int N){ int P,i; int flag; for(P=N-1;P&gt;=0;P--){ flag=0; for(i=0...

种树最好的时间是10年前,其次是现在!!! 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

python实现十大排序算法

算法和数据结构是程序员的必修课 前两篇博文我们分别用C++和Java实现了十大排序算法 C++实现十大排序算法 Java实现十大排序算法 现在我们用python来实现一下十大排序算法 具体代码可以访问我的GitHub地址获取 https://github.com/liuzuoping/Algorithms 1 冒泡排序 冒泡排序无疑是最为出名的排序算法之一,从序列的一端开始往另一端冒泡(你可以...

liuzuoping的博客 1541

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

十大排序算法汇总

涵盖。

weixin_47868976的博客 1090

十大经典排序算法的理解、动图演示和Python、C、C++语言方法实现

1. 排序算法概述 排序:将一组“无序”的记录序列调整为“有序”的记录序列 排序算法 平均时间复杂度 最好情况 最坏情况 空间复杂度 稳定性 冒泡排序 O(n2)O(n^2)O(n2) O(n)O(n)O(n) O(n2)O(n^2)O(n2) O(1)O(1)O(1) 稳定 选择排序 O(n2)O(n^2)O(n2) O(n2)O(n^2)O(n2) O(n2)O(n^2)O(n2) O(1)O(1)O(1) 不稳定 插入排序 O(n2)O(n^2)O(n2) O(n)O(n)O

frighting_ing的博客 1051

浅析十大排序算法

常见排序算法原理及代码实现

weixin_42263762的博客 1120

2025-1-15-十大经典排序算法 C++与python

2025-1-15-十大经典排序算法 C++与python

weixin_42269028的博客 3045

排序算法的python和c++实现

各种排序算法原理请看 十大排序算法原理解释 归并排序如下 class MySort: def merge(self, list1, list2): &quot;&quot;&quot; 归并排序中的单步操作 :param list1: :param list2: :return: &quot;&quot;&quot; res = [] ...

右手点天下 229

综合分析一下各个排序算法_十大经典排序算法的分析与实现

十大经典排序算法的分析与实现排序算法实乃面试以及日常工作学习所必备。本文细致总结了十大经典排序算法,详细讲解了原理并用三种主流语言进行实现。建议点击收藏关注后慢慢阅读!绪论在具体介绍算法前,我们首先来了解一下排序算法的评价标准。时间复杂度:从序列的初始状态到经过排序算法的变换移位等操作变到最终排序好的结果状态的过程所花费的时间度量。空间复杂度:从序列的初始状态经过排序移位变换的过程一直到...

weixin_40004051的博客 379

十大经典排序算法之选择排序算法

十大经典排序算法之选择算法(包含C++和Python程序,即粘即用,注释清晰)

yzyzy12138的博客 144

C++、Python实现十大经典排序算法

一、算法概述 1. 算法 算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。 2. 算法的特性 算法具有五个特性:有穷性、确定性、可行性、输入和输出。 3. 算法的设计目标 算法的设计目标是:正确性、可使用性、可读性、健壮性和算法效率。 其中算法效率通过算法时间复杂度和空间复杂度来描述。 高效率与低存储量需求:通过算法的效率主要指算法的执行时间,对于同一个问题,如果有多种算法可以求解。执行时间短的算法效率高。宋草存储量指的是算法执行过程中所需的最大存储空间,算法效率和

qq_44723773的博客 675

十大经典排序算法C++和Python实现总结(动图演示)

一、算法概述 1. 算法分类 十种经典的排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。 2. 算法复杂度 #### 3. 相关概念 1. 稳定:如果a原本在b前...

程序猿之家 795

c++ 不插入重复元素但也不排序_一起来用python实现一下十大经典排序算法

前言既然之前很多小伙伴反应希望公众号多发点算法类的文章,那就来呗。先从简单的入手好了,带大家用python来实现一波十大经典排序算法呗。分别是:冒泡排序;选择排序;插入排序;希尔排序;归并排序;快速排序;堆排序;计数排序;桶排序;基数排序。废话不多说,让我们愉快地开始吧~冒泡排序基本原理比较类排序算法。算法描述如下(假设是升序排序):比较相邻的元素,如果第一个元素比第二个大,就交换它们;...

weixin_39869733的博客 89
上一篇: 完结撒花!吴恩达DeepLearning.ai《深度学习》课程笔记目录总集
下一篇: 二叉树的非递归遍历
大树先生的博客
博客等级 码龄9年 2692粉丝 200原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值