编程语言
首页 > 编程语言> > 十大常规排序算法Ⅰ

十大常规排序算法Ⅰ

作者:互联网

void Swap(int *a,int *b)  //交换两个数
{
    int temp = *a;
    *a=*b;
    *b=temp;
}


1、冒泡排序


描述:
①比较相邻的原始,如果第一个比第二个大就交换两个数。
②从第一对到结尾的最后一对执行①的操作,这样最后的元素已经排序成功。
③在剩下序列中,对所有元素重复①②的操作,
④以此执行①②③直到剩下的序列元素为0

复杂程度:
时间复杂度O(n^2)    空间复杂度O(1)

//参数:指针 数组大小 返回大小
//返回:指针

//数组 冒泡排序(数组,数组大小,返回大小)
int* Bubblesort(int* nums, int numsSize, int* returnSize){
    *returnSize = numsSize;
    if(numsSize == 0 || numsSize == 1)
    {
        return nums;
    }
    for(int i=0;i<numsSize;i++){
        for(int j=1;j<numsSize-i;j++)
        {
            if(nums[j-1]>nums[j]){
                Swap(&nums[j],&nums[j-1]);  //交换数据
            }
        }
    }
    return nums;
}


2、选择排序


描述:
①初始状态:有序区为空,无序区为0-[n-1]。
②从无序区0-[n-1]中找到最小元素的位置i,交换[i]区和无序区的首区。此时:有序区为[0],无序区为1-[n-1]
③重复执行②n-1次以后,数组就有序化了

复杂程度:
时间复杂度O(n^2)    空间复杂度O(1)

int* Selectionsort(int* nums, int numsSize, int* returnSize){
    *returnSize = numsSize;
    if(numsSize == 0 || numsSize == 1)
    {
        return nums;
    }
    for(int i=0;i<numsSize;i++){
        int Min=i;
        for(int j=i;j<numsSize;j++)
        {
            if(nums[j]<nums[Min]){
                Min=j;
            }
        }
        Swap(&nums[i],&nums[Min]);
    }
    return nums;
}

3、插入排序


描述:
①初始状态:有序区为0,无序区为1-[n-1]。
②取下无序区首元素,在已经排列好的元素序列中从后往前扫描
③如果该元素(已排列)大于新元素,将该元素后移。
④重复执行③操作,直到找到一个小于或等于新元素的位置
⑤将新元素插入该位置。
⑥重复执行②~⑤,直到无序区为空

时间复杂度O(n^2)    空间复杂度O(1)

void InsertSort(int *arry,int numsSize)
{
    *returnSize = numsSize;
    if(numsSize == 0 || numsSize == 1)
    {
        return nums;
    }
    for(int i=1;i<numsSize;i++){
        int key=nums[i],count=i; //保存新数据
        while(count >0 && nums[count-1]>key) 
        {
            nums[count]=nums[count-1]; //老数据后移
            count--;
        }
        nums[count] = key;    //新数据位置赋值
    }
    return nums;
}

 

标签:numsSize,nums,int,复杂度,无序,常规,算法,区为,排序
来源: https://blog.csdn.net/qq_37820135/article/details/110851516