虽然这些算法都是比较基础的,大一入学就在学的东西,但估计自己还是有很多地方没有掌握弄懂的,今天来码一遍。
冒泡排序
冒泡排序应该是排序算法中最基础的,也最好理解的了(猴子排序呢??(滑稽)),它是通过容器里的元素两两比较大小交换顺序来实现的。假设数组的长度为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);
}