排序算法复习1(冒泡排序,插入排序,快速排序)

本文深入解析了三种基础排序算法:冒泡排序、插入排序和快速排序。详细介绍了每种算法的工作原理,包括步骤、流程图及核心代码实现,并分析了它们的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虽然这些算法都是比较基础的,大一入学就在学的东西,但估计自己还是有很多地方没有掌握弄懂的,今天来码一遍。

冒泡排序

冒泡排序应该是排序算法中最基础的,也最好理解的了(猴子排序呢??(滑稽)),它是通过容器里的元素两两比较大小交换顺序来实现的。假设数组的长度为n,则需要比较n-1趟,每一趟里也有一个循环,可知最坏情况下复杂度为O(n^2),手写一个图解:
在这里插入图片描述
因为每一趟都会进行两两比较,所以每一趟都可以至少排好一个元素。
太久没有写了,有些生疏,应该还能做一些优化。核心的过程如下。偷一下懒,就不封装进函数了:

for(int i=0;i<array.Length;i++)
 {
  for(int j=0;j<array.Length-1-i;j++)
  {
   if(array[j]>array[j+1])
   {
    int temp;
    temp=array[j];
    array[j]=array[j+1];
    array[j+1]=temp; 
   } 
  } 
 }

插入排序

插入排序是每一次循环将第一个未排序的元素插入已经排好序的元素序列中的合适位置,使之成为一个新的升序。也比较简单,画一个图来解释:
在这里插入图片描述
第一次8为单个元素,看作是排好的,取出它的后一个元素4(用一个temp),4比8小,所以将8后移,原来的位置,然后4已经没有需要比较的元素了,所以补在8的位置,这样4,8就排好了。
然后将6取出,进行相同的操作,6比8小,所以将8后移到6的位置。6和4比较,6比4大,4不后移,而直接把6插入到4之后,即8后移后空出的位置。
如此反复就完成排序了

在这里插入图片描述
附上插入的过程,便于理解
在这里插入图片描述
这也是一个写二重循环的方法,时间复杂度O(n^2),附上核心的过程:

 int temp2;
 for(int i=1;i<array2.Length;i++)
 {
  temp2=array2[i];
  int j=i-1;
  while(j>=0&&array2[j]>temp2)
  {
   array2[j+1]=array2[j];
   j--;
  }
  array2[j+1]=temp2;
 }

快速排序:

这种排序算法用到了递归分治的思想,刚开始写的时候还有点没反应过来。目标就是取得的标记元素,让左边的元素全部是小于标记元素的,而右边的元素全部大于标记元素,然后左边和右边分别进行递归。

首先取6为一个key,i位于首元素,j位于尾元素
在这里插入图片描述

判断如果I的值大于key则停下,否则向后移动;同样,如果j的值小于key则停下,否则向前移动。两个都停下后如果I和j还没有相遇,就交换两个的顺序
在这里插入图片描述
在这里插入图片描述

然后继续同样的操作,直到ij碰到一起,将ij共同指向的元素与key交换顺序(此时保证I,j指向的元素小于key)
在这里插入图片描述

一次操作就完成了,接下来分左右进行递归:
在这里插入图片描述
有个比较坑的点:为了保证每次两个“指针”碰头的时候指向的元素是小于标记元素的,要让右边的指针先移动,左边的后移动。

核心代码:

void QuickSort(int left,int right)
{
 int i,j,m,temp;
 if(left>right)return;
 temp=ar3[left];
 i=left;
 j=right;
 while(i!=j)
 {
  while(ar3[j]>=temp&&i<j)
  {
   j--;
  }
  while(ar3[i]<=temp&&i<j)
  {
   i++;
  }
  if(i<j)
  {
   m=ar3[i];
   ar3[i]=ar3[j];
   ar3[j]=m;
  }
 }
 ar3[left]=ar3[i];
 ar3[i]=temp;
 //Recursion
 QuickSort(left,i-1);
 QuickSort(i+1,right);
}

结束

完整的代码以及测试结果:

#include<iostream>
int ar3[14]={3,5,8,1,6,15,17,11,2,4,13,18,7,20};
void print1(int a[5])
{
 for(int i=0;i<5;i++)
 {
  std::cout<<a[i]<<" ";
 }
 std::cout<<"\n";
}
void print2(int a[14])
{
 for(int i=0;i<14;i++)
 {
  std::cout<<a[i]<<" ";
 }
 std::cout<<"\n";
}
void QuickSort(int left,int right)
{
 int i,j,m,temp;
 if(left>right)return;
 temp=ar3[left];
 i=left;
 j=right;
 while(i!=j)
 {
  while(ar3[j]>=temp&&i<j)
  {
   j--;
  }
  while(ar3[i]<=temp&&i<j)
  {
   i++;
  }
  if(i<j)
  {
   m=ar3[i];
   ar3[i]=ar3[j];
   ar3[j]=m;
  }
 }
 ar3[left]=ar3[i];
 ar3[i]=temp;
 QuickSort(left,i-1);
 QuickSort(i+1,right);
}
int main()
{
 int array[5]={3,10,3,10,4};
 int array2[5]={15,15,18,10,10};
 std::cout<<"bubblesort:"<<std::endl;
 print1(array);
 for(int i=0;i<5;i++)
 {
  for(int j=0;j<4-i;j++)
  {
   if(array[j]>array[j+1])
   {
    int temp;
    temp=array[j];
    array[j]=array[j+1];
    array[j+1]=temp; 
   } 
  } 
 }
 print1(array);
 //insert sort
 std::cout<<"insert sort:"<<std::endl;
 print1(array2);
 int temp2;
 for(int i=1;i<5;i++)
 {
  temp2=array2[i];
  int j=i-1;
  while(j>=0&&array2[j]>temp2)
  {
   array2[j+1]=array2[j];
   j--;
  }
  array2[j+1]=temp2;
 }
 print1(array2);
 //quick sort
 std::cout<<"quick sort:"<<std::endl;
 print2(ar3);
 QuickSort(0,13);
 print2(ar3);
} 

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值