1、冒泡排序
- 原理
从第一个开始与后面的一个比较如果不相等就替换,一直比下去就会把最大的或者最小的比到最后一个元素,下一次比较的时候就把第二大或者第二小的放在倒数第二个,依次重复下去就实现排序。
- 时间复杂度
冒泡排序最好的时间复杂度为O(n)
冒泡排序的最坏时间复杂度为O(n^2)
冒泡排序最好的时间复杂度为O(n)
- 空间复杂度
排序过程中只是使用数组原本的空间进行排序,因此空间复杂度为O(1)
void Bubble_Sort(int arr[],int size)
{
int i=0,k=0;
int temp = 0;
for(i=0;i<size;i++)
{
for(k=0;k<size-i-1;k++)
{
if(arr[k]<=arr[k+1]) // 从大到小
{
temp = arr[k]; // 替换位置
arr[k] = arr[k+1];
arr[k+1] = temp;
}
}
}
}
2、快速排序
- 原理
选择一个数据为基准,将数组中的比他小的数据放一边,大的数据放在另外一边。
- 时间复杂度
快速排序算法在分治法的思想下,原数列在每一轮被拆分成两部分,每一部分在下一轮又分别被拆分成两部分,直到不可再分为止,平均情况下需要logn轮,因此快速排序算法的平均时间复杂度是O(nlogn)
在极端情况下,快速排序算法每一轮只确定基准元素的位置,时间复杂度为O(N^2)
- 空间复杂度
快速排序算法排序过程中只是使用数组原本的空间进行排序,因此空间复杂度为O(1)
- 稳定性
快速排序算法在排序过程中,可能使相同元素的前后顺序发生改变,所以快速排序是一种不稳定排序算法。
/*
快速排序
递归的思想实现的时候注意退出条件
*/
void Quick_Sort(int arr[],int left,int right)
{
/*退出条件*/
if(left>=right){
return;
}
int r = right,l = left;
int pot = arr[l]; // 把最左边的数据当成基准
while(l<r)
{
/*右边往左边一个个的判断*/
while((l<r)&&(pot<=arr[r])){
r--;
}
if(l<r){
arr[l] = arr[r];
}
/*左边往右边判断*/
while((l<r)&&(pot>=arr[l]))
{
l++;
}
if((l<r)){
arr[r] = arr[l];
}
if(l>=r){
arr[l] = pot;
}
}
Quick_Sort(arr,left,r-1);
Quick_Sort(arr,r+1,right);
}
