欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【练习】常用排序以及C++/python实现

程序员文章站 2022-04-15 16:34:17
...

突然想要整理一下常用的排序算法,用python和C++都来写一写^_^。无论是python还是C++结构都差不多,没考虑什么优化方法。

【冒泡排序】

每次比较相邻的两个元素,若是前者比后者大,则交换两个的位置。对数组的每一对相邻两个元素进行比较,进行n-1次比较(n为数组长度)后,最后一个元素一定是最大的数。重复以上步骤,直至没有任何一对数字需要比较(每次都不用再比较前一次步骤中的最后一个数了)
例如对序列6、2、1、8、2、5、0、3、4进行排列:
【练习】常用排序以及C++/python实现

python实现:

##冒泡排序
def bubble_sort(array):
    for i in range(len(array)-1):
        for j in range(len(array)-1-i):
            if array[j]>array[j+1]:
                array[j],array[j+1]=array[j+1],array[j]
    return array
array1=[6,2,1,8,2,5,0,3,4]
print(bubble_sort(array1))

C++实现:

//冒泡排序
void Solution::Bubble_Sort(int array[], int length)
{
    int i, j;
    for (j = 0; j < length - 1; j++)
    {
        for (i = 0; i < length - 1 - j; i++)
        {
            if (array[i] > array[i + 1])
            {
                array[i] = array[i] ^ array[i + 1];
                array[i + 1] = array[i] ^ array[i + 1];
                array[i] = array[i] ^ array[i + 1];
            }
        }
    }
}

【直接选择排序】

将数组中第一个数字的位置用min记录,表示最小值所在位置,即将第一个数字视为当前最小值。将后面数字与最小值进行比较,若出现数字小于最小值,则更新min为这个数字所在位置,即将这个数字视为当前最小值。遍历完所有数字后,将当前最小值和第一个数字进行交换,则第一个数字是数组中最小的。以此类推,将数组中第二个数字的位置用min记录,后面过程与前面过程相同。
例如对序列6、2、1、8、2、5、0、3、4进行排列:
【练习】常用排序以及C++/python实现
python实现:

##直接选择排序
def direct_select_sort(array):
    for i in range(len(array)):
        min = i
        for j in range(i+1, len(array)):
            if array[j] < array[min]:
                min = j
        array[i], array[min] = array[min], array[i]
    return array
array1=[6,2,1,8,2,5,0,3,4]
print(direct_select_sort(array1))

C++实现:

//直接选择排序
void Solution::DirectInsert_Sort(int array[], int length)
{
    int i, j, min;
    for (i = 1; i<length; i++)
    {
        min = array[i];
        j = i - 1;
        while (j >= 0 && array[j]>min)
        {
            array[j + 1] = array[j];
            j = j - 1;
        }
        array[j + 1] = min;
    }
}

【直接插入排序】

我们通常将第一个元素当做已经被排序的元素,取下一个元素作为待插入已排序列中的元素,记作key。在已经排列的元素序列中从后往前与key进行比较,用j来记录当前位置,若当前位置元素比key大,则j-1,向前一位再与key进行比较,直到当前位置元素小于key,或者到达这个序列的顶端(当j=0时,表示走到这个已排序列的第一个元素)。将key插入到新的位置当中。
例如对序列6、2、1、8、2、5、0、3、4进行排列:
【练习】常用排序以及C++/python实现
python实现:

##直接插入排序
def insert_sort(array):
    for i in range(1, len(array)):
        key = array[i]
        j = i - 1
        while j >= 0 and array[j] > key:
            array[j+1] = array[j]
            j -= 1
        array[j+1] = key
    return array
array1=[6,2,1,8,2,5,0,3,4]
print(insert_sort(array1))    

C++实现:

//直接插入排序
void Solution::DirectInsert_Sort(int array[], int length)
{
    int i, j, key;
    for (i = 1; i<length; i++)
    {
        key = array[i];
        j = i - 1;
        while (j >= 0 && array[j]>key)
        {
            array[j + 1] = array[j];
            j = j - 1;
        }
        array[j + 1] = key;
    }
}

【快速排序】

每一趟排序都会选择一个基准数,标记为key,一般为了方便选择第一个数作为基准数,当然也可以随机选取。然后我们设定两个哨兵i和j,分别从待排序序列的左边和右边同时向对面前进。左边哨兵i找到一个比key大(或相等)的数就停下来,右边哨兵j找到一个比key小(或相等)的数就停下来,交换这两个数。然后哨兵i继续向右走,哨兵j继续向左走,直到ij,我们将key与i所在位置的元素交换。这样我们会发现key的左边都是小于等于它的数字,而右边都是大于等于它的数字。然后递归地对左右两边的子序列按照上面的步骤进行排序,直至拆分不出新的子序列为止。
例如对序列6、2、1、8、2、5、0、3、4进行排列:
【练习】常用排序以及C++/python实现
python实现:

##快速排序
def quick_sort(array, left, right):
    if left >= right:
        return array
    key = array[left]
    i = left
    j = right
    while i < j:
        while i < j and array[j] >= key:
            j -= 1
        array[i] = array[j]
        while i < j and array[i] <= key:
            i += 1
        array[j] = array[i]
    array[j] = key
    quick_sort(array, left, i - 1)
    quick_sort(array, i + 1, right)
    return array   
array1=[6,2,1,8,2,5,0,3,4]
print(quick_sort(array1))     

C++实现:

//快速排序
void Solution::Quicksort(int array[], int left, int right, int length)
{
    int i, j, key;
    if (left > right)
        return;
    key = array[left];
    i = left;
    j = right;
    while (i < j)
    {

        while (i < j && array[j] >= key)
        {
            j--;
        }
        while (i < j && array[i] <= key)
        {
            i++;
        }
        if (i < j)
        {
            array[i] = array[i] ^ array[j];
            array[j] = array[i] ^ array[j];
            array[i] = array[i] ^ array[j];
        }
    }
    array[left] = array[i];
    array[i] = key;
    Quicksort(array, left, i - 1, length);
    Quicksort(array, i + 1, right, length);
}

【归并排序】

归并排序采用了典型的分治策略,将待排序列拆分成一个一个的子序列,再将这些子序列合并成有序序列。
例如对序列6、2、1、8、2、5、0、3、4进行排列:
【练习】常用排序以及C++/python实现
python实现:

##归并排序
def MergeSort(array):
    if len(array) <= 1:
        return array
    num = int( len(array) / 2 )
    ##递归的拆分左子序列和右子序列
    left = MergeSort(array[:num])
    right = MergeSort(array[num:])
    return Merge(left,right)
##归并    
def Merge(left,right):
    l, r = 0, 0
    result=[]
    while l<len(left) and r<len(right):
        if left[l] < right[r]:
            result.append(left[l])
            l += 1
        else:
            result.append(right[r])
            r += 1
    result += left[l:]
    result += right[r:]
    return result
array1=[6,2,1,8,2,5,0,3,4]
print(MergeSort(array1))

C++实现:

//归并排序
void Solution::Mergesort(int *array, int start, int end, int *result)
{
    if (start < end)
    {
        int mid = (start + end) / 2;
        Mergesort(array, start, mid, result);                    
        Mergesort(array, mid + 1, end, result);                  
        Merge(array, start, mid, end, result);                    
    }
}

void Solution::Merge(int *array, int start, int mid, int end, int *result)
{
    int l, r, k;
    l = start;
    r = mid + 1;                        
    k = 0;
    while (l <= mid && r <= end)//mid即为左子序列长度,end即为右子序列长度        
    {
        if (array[l] <= array[r])        
            result[k++] = array[l++];    
        else
            result[k++] = array[r++];    
    }
    while (l <= mid)                    
        result[k++] = array[l++];        
    while (r <= end)                    
        result[k++] = array[r++];        

    for (l = 0; l < k; l++)             
        array[start + l] = result[l];    
}

复杂度

【练习】常用排序以及C++/python实现

相关标签: