排序

作者: Pepi熊 | 来源:发表于2020-04-16 15:23 被阅读0次

1.冒泡排序法

前提:元素大小已排序.
时间复杂度:O(n2)(2个嵌套for循环).
适用:线性表的 顺序存储 & 链式存储 .

冒泡排序法
#include "iostream"
using namespace std;
int BubbleSort(int* array, int* my_len)
{
    if(array==NULL|| my_len==NULL)//负面测试
    {
        return -1;
    }
    int temp = 0;
    int i,j;//前一个元素i,后一个元素j
    for(i = 0; i< *my_len; i++)//嵌套两个for循环,时间复杂度O(n^2)
    {
        for(j = i+1; j < *my_len; j++)
        {
            if(*(array + i) < *(array + j))//交换 <:从大到小 >:从小到大 
            {
                temp = *(array + i);
                *(array + i) = *(array + j);
                *(array + j) = temp;
            }
        }
    }
    return 0;
}




int main()
{
    int arr[] = { 1,3,2,1,66,18,12,77 };
    int *array = arr;//不能直接传递数组名arr,会退化成指针(并且为整个数组指针)而array为单个数组元素指针
    int len = sizeof(arr) / sizeof(*arr);//数组高位 数组名48字节/数组取地址4字节

    //函数调用:BubbleSort()冒泡法
    int ret = BubbleSort(array,&len);
    if (ret == -1)
    {
        cout << "传入空指针!错误码:" << ret << endl;
        return 0;
    }

    for(int i =0; i<len; i++)
    {
        cout <<i<<":"<<arr[i] << endl;
    }
    
    system("pause");

}

2.选择排序法

前提:元素大小已排序.
时间复杂度:O(n2)(2个嵌套for循环).
适用:线性表的 顺序存储 & 链式存储 .
*优点:相比上种节省内存空间

选择排序法
#include "iostream"
using namespace std;
//交换
int Swap(int* argc, int* argv)
{
    if (argc == NULL&&argv == NULL)
    {
        return -1;
    }

    int temp = 0;
    temp = *argc;
    *argc = *argv;
    *argv = temp;
    return 0;
}

//选择冒泡(version1.0)
int SelectionSort_01(int* array, int* my_len)
{
    if (array == NULL || my_len == NULL)//负面测试
    {
        return -1;
    }

    int i, j;//前一个元素i,后一个元素j


    for (i = 0; i< *my_len-1; i++)//嵌套两个for循环,时间复杂度O(n^2)注意-1
    {
        
        int max = *(array + i);//重置max为之前(i)最大的数!!!
        int temp = i;//如果temp没有变化就让temp =i,自己跟自己交换!!!
        for (j = i+1; j < *my_len; j++)//在后面选最大/小的。
        {
            if ( max < *(array + j))//交换 <:从大到小 >:从小到大 
            {
                max = *(array + j);
                temp = j;
            }
        }
        Swap( (array + temp), (array + i) );
        
    }
    return 0;
}

//选择冒泡(version2.0)
int SelectionSort_02(int* array, int* my_len)
{
    if (array == NULL || my_len == NULL)//负面测试
    {
        return -1;
    }
    int i, j;

    for (i = 0; i < *my_len - 1; i++)
    {
        int max = i;
        for (j = i + 1; j < *my_len; j++)     //走訪未排序的元素
            if (*(array + j) > *(array + max))    //找到目前最小值
                max = j;    //紀錄最小值
        Swap((array + max), (array + i)); //做交換
    }
    return 0;
}





int main()
{
    int arr[] = { 1,3,2,1,66,18,12,77 };
    int *array = arr;//不能直接传递数组名arr,会退化成指针(并且为整个数组指针)而array为单个数组元素指针
    int len = sizeof(arr) / sizeof(*arr);//数组高位 数组名48字节/数组取地址4字节

    //函数调用:SelectionSort();选择排序法
    int ret = SelectionSort_01(array, &len);
    if (ret == -1)
    {
        cout << "传入空指针!错误码:" << ret << endl;
        return 0;
    }

    for (int i = 0; i<len; i++)
    {
        cout << i << ":" << arr[i] << endl;
    }

    system("pause");

}

3.插入排序法

前提:元素大小已排序.
时间复杂度:O(n2)(2个嵌套for循环).
适用:线性表的 顺序存储 & 链式存储 .

插入排序法
#include "iostream"
using namespace std;


//插入排序
int InsertSort(int* array, int* my_len)
{
    if (array == NULL || my_len == NULL)//负面测试
    {
        return -1;
    }

    int i, j;//前一个元素i,后一个元素j

    int key = 0;
    for (i = 1;i<*my_len;i++)
    {
        key = array[i];
        j = i - 1;
        while ( (j >= 0) && (array[j]<key) ) 
        {
            array[j + 1] = array[j];
            j--;
        }
        array[j + 1] = key;//重新赋值
    }
    return 0;
}






int main()
{
    int arr[] = { 1,3,2,1,66,18,12,77 };
    int *array = arr;//不能直接传递数组名arr,会退化成指针(并且为整个数组指针)而array为单个数组元素指针
    int len = sizeof(arr) / sizeof(*arr);//数组高位 数组名48字节/数组取地址4字节

                                         //函数调用:SelectionSort();选择排序法
    int ret = InsertSort(array, &len);
    if (ret == -1)
    {
        cout << "传入空指针!错误码:" << ret << endl;
        return 0;
    }

    //打印
    for (int i = 0; i<len; i++)
    {
        cout << i << ":" << arr[i] << endl;
    }

    system("pause");
    return 0;

}

相关文章

  • 【恋上数据结构与算法二】(一)排序(Sorting)

    排序方法 冒泡排序 选择排序 堆排序 插入排序 归并排序 快速排序 希尔排序 计数排序 基数排序 桶排序 初识排序...

  • 排序-冒泡排序

    排序系列传递门 排序—选择排序排序—快速排序排序—插入排序排序-希尔排序(待完善)排序—归并排序(待完善)排序—基...

  • 排序

    冒泡排序: 冒泡排序 选择排序: 插入排序: 希尔排序: 归并排序: 快速排序: 堆排序: 计数排序: 桶排序: ...

  • Java | 10种排序算法

    冒泡排序 选择排序 插入排序 希尔排序 计数排序 基数排序 堆排序 归并排序 快速排序 桶排序

  • 常见的排序

    冒泡排序: 选择排序: 插入排序: 快速排序: 希尔排序: 归并排序: 堆排序: 计数排序: 桶排序: 基数排序:

  • 002--20200409刷题

    冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 计数排序 桶排序 基数排序

  • 排序

    排序 符号:Θ 插入排序 选择排序 堆排序 归并排序 冒泡排序 快速排序 桶排序 基数排序 计数排序 插入排序 插...

  • 排序 -- 选择/插入

    聊聊排序吧 冒泡排序 选择排序 插入排序 快速排序 归并排序 计数排序 桶排序 堆排序 本篇 选择排序与插入排序 ...

  • 前端基础整理 | 算法基础

    排序算法 冒泡排序 选择排序 插入排序 希尔排序 归并排序 堆排序 快速排序

  • Java 常见的 8 种排序算法(内排序)

    排序分类 内部排序 插入排序:直接插入排序、希尔排序 交换排序:冒泡排序、快速排序 选择排序:直接选择排序、堆排序...

网友评论

      本文标题:排序

      本文链接:https://www.haomeiwen.com/subject/hqmrvhtx.html