1.冒泡排序
原理:冒泡排序正如他的名字一样,大泡泡都会往上飘,把数组元素两两进行比较,按照大小一个一个往数组一侧移动
例:这有一个{5,2,3,1,4}的数组
首先5,2会相互比较,判定5>2 这个时候5就会跟2交换
接下来5会和3进行比较,以此类推,第一轮循环走完就会变成下图
后续的原理是一样的,经过lenth-1 轮后就排好序了
动图如下
冒泡排序的代码
void bubble_sort(int arr[], int lenth)
{
int i,j,temp;
for(i=0;i<lenth-1;i++)
{
for(j=0;j<lenth-1-i;j++)
{
if(a[j]>a[j+1])
{
temp = a[j+1];
a[j+1] = a[j];
a[j] = temp;
}
}
}
}
冒泡排序虽然简单且稳定,但是所需要的循环次数多,时间复杂度太高了,对于一些有时间需求的排序来说,达不到需求。
2.快速排序
快速排序:主要是通过找一个中位数,通过这个中位数把数组分成两部分,左边比中位数小,右边比中位数大,在对这两部分进行同样的操作(即找中位数分成两部分)
快速排序通过取两个指针一左一右,来寻找那个中位数,通常我们取最左边的数
附上一个动图方便大家理解(这个动图取最右边元素作为标志数)
附上代码:
int partition(int arr[], int start, int end)
{
int i = start;
int j = end - 1;
int flag_number = arr[i];
while (i < j)
{
while (i<j && arr[j] >= flag_number)
{
j--;
}
arr[i] = arr[j];
while (i < j && arr[i] <= flag_number)
{
i++;
}
arr[j] = arr[i];
}
arr[i] = flag_number;
return i;
}
void quick_sort(int arr[], const int start, const int end)
{
if (start < end - 1)
{ /* 至少两个元素 */
const int pivot_pos = partition(arr, start, end);
quick_sort(arr, start, pivot_pos);
quick_sort(arr, pivot_pos + 1, end);
}
}
int main()
{
int num[10] = { 5,2,3,6,1,4 };
quick_sort(num, 0, 6);
for (int i = 0; i < 6; i++)
cout << num[i] << endl;
}
优点:平均性能好,速度快
缺点:不稳定,。
3.冒泡排序与快速的差别
(1)稳定性
快速排序不稳定
冒泡排序稳定
(2)时间复杂度
快速排序:时间复杂度为 O(nlogn),
冒泡排序:时间复杂度为 O(n2)
(3)效率
快速排序:复杂但是效率高,适用于多数据
冒泡排序:简单但效率低,适用于少量数据