交换排序的思想是,比较两个元素的大小,然后确定是否交换位置,主要分为两种
- 冒泡排序
- 快速排序
- 冒泡排序,依次比较相邻的两个元素,把最值放在头部或者尾部,接下来再用同样的方法取最值放在头部或尾部。代码如下
void bubbleSort(int a[], int n)
{
int t;
for(int i = n - 1; i >0; i--)
{
for(int j = 0; j < i; j++)
{
if(a[j]>a[j+1]){
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
}
- 快速排序,首先设定一个分界值,然后通过分界值,将数组分成两部分,比如,一部分大于这个值,另一部分小于这个值。然后再从两部分中取分界值,递归操作。代码如下
// 递归实现
void quickSort(int arr[], int left, int right)
{
int i = left;
int j = right;
int base = arr[i];
if(left>=right)
return;
while(i<j){
while(i<j && base < arr[j])
j--;
if(i<j)
arr[i] = arr[j];
while(i<j && base > arr[i])
i++;
if(i<j)
arr[j] = arr[i];
}
arr[i] = base;
quickSort(arr, left,i-1);
quickSort(arr, i+1,right);
}
- 算法复杂度分析
- 冒泡排序 平均复杂度O(N^2) 最坏时间复杂度O(N^2) 空间复杂度O(1) 稳定
- 快速排序 平均复杂度O(NlogN) 最坏时间复杂度O(N^2) 空间复杂度O(NlogN) 不稳定
快速排序基于分治思想,log以2为底,一遍找元素O(N),一遍找位置O(logN)