排序在各次面试的过程中问道的次数不少,冒泡排序和快速排序尤多。因此做一些总结,尤其是代码部分。
1. 冒泡排序
(1)思想
在一组数中,对当前未排好序的数,自上而下地对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的数往上冒。
(2)复杂度
平均情况-O(n^2)
最坏情况-O(n^2)(逆序有序)
最好情况-O(n)(正序有序)
空间复杂度-O(1)
(3)稳定性
稳定
(4)伪码
bubblesort(A)
{
for i=1 to length[A] // 排序的趟数
{
for j=length[A] to i+1 // 对未排序的数进行比较
{
if A[j]<A[j-1] // 若相邻两个数中前者大于后者
{
exchange A[j] and A[j-1]; // 进行交换,将小数往上冒
}
}
}
}
bubblesort(A)
{
for i=1 to length[A] // 排序的趟数
{
for j=1 to length[A]-i // 对未排序的数进行比较
{
if A[j]<A[j-1] // 若相邻两个数中前者大于后者
{
exchange A[j] and A[j-1]; // 进行交换,将大数往下沉
}
}
}
}
(5)C++实现
void bubble_sort(int a[], int length)
{
if(a == NULL || length == 0)
return;
for(int i=0; i<length; i++)
{
for(int j=length-1; j>i; j--)
{
if(a[j-1] > a[j])
{
int tmp=a[j];
a[j]=a[j-1];
a[j-1]=tmp;
}
}
}
}
void bubble_sort(int a[], int length)
{
if(a == NULL || length == 0)
return;
for(int i=0; i<length; i++)
{
for(int j=0; j<length-i; j++)
{
if(a[j-1] > a[j])
{
int tmp=a[j];
a[j]=a[j-1];
a[j-1]=tmp;
}
}
}
}
2. 快速排序
(1)思想
选择一个基准元素(通常是第一个或者最后一个),通过一趟排序将排序数组分成比基准元素小的部分和比基准元素大的部分,此时基准元素在这两个部分的中间位置,然后再分别对这两个部分排序。
一趟排序:
1)设置左索引、右索引和基值
2)从右往左找更小,调换更小与索引位置
3)从左往右找更大,调换更大与索引位置
(2)复杂度
平均情况-O(nlogn)
最坏情况-O(n^2)(基本有序)
最好情况-O(nlogn)(每次都将序列分为两个部分)
空间复杂度-O(nlogn)
(3)稳定度
不稳定
(4)伪码
PARTITION(A, p, r)
{
x=A[r]; // 以最后一个值为基准值
i=p-1;
for j=p to r-1
{
if A[j]<=x
{
i=i+1; // i用来记录比基值小的元素的最大索引,可理解为比基准小的元素数量
exchange A[i] and A[j]; // 将比基值小的放左边,大的放右边
}
}
exchange A[i+1] and A[r]; // 将基值交换到切分点上
return i+1;
}
QUICKSORT(A, p, r)
{
if p<r
{
q=PARTITION(A, p, r);
QUICKSORT(A, p, q-1);
QUICKSORT(A, q+1, r);
}
}
(5)C++实现
int partition(int A[], int low, int high)
{
int pivot=A[high];
int i=low-1;
for(int j=low; j<high; j++)
{
if(A[j]<=pivot)
{
i++;
swap(A[i], A[j]);
}
}
swap(A[i+1], A[high]);
return i+1;
}
void quicksort(int A[], int low, int high)
{
if(low<high)
{
int q=partition(A, low, high);
quicksort(A, low, q-1);
quicksort(A, q+1, high);
}
}
void swap(int &a, int &b)
{
int tmp=a;
a=b;
b=tmp;
}
(6)应用
qsort()函数
1)函数库
#include<cstdlib>
2)用法
void qsort(void *base, int nelem, int width, int (*fcmp)(const void *, const void *));
3)