十大常规排序算法Ⅰ
作者:互联网
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