1. 选择排序
排序算法中选择排序应该是最好理解的了吧,
两层循环,外层循环n次,
内层循环从第i个元素后一个元素开始,遇到比当前元素大的就交换数据,
两层循环走完排序就结束了。
时间复杂度为O(n^2)
空间复杂度为O(1)
for(int i = 0; i < len; i++)
{
for(int j = i+1; j < len; j++)
{
if(arr[i]<arr[j])
{
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
2. 冒泡排序
冒泡排序和选择排序有点像,
也是两层循环,外层循环n次,
内层循环从第0个元素到第n-i个元素,只比较相邻的元素,前一个元素更大就交换,
两层循环走完排序就结束了。
时间复杂度为O(n^2)
空间复杂度为O(1)
for(int i = 0; i < len; i++)
{
for(int j = 0; j < len-i-1; j++)
{
if(arr[j]>arr[j+1])
{
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
选择排序的交换次数通常少于冒泡排序,因此在实际使用时速度会稍快。
3. 插入排序
插入排序是将数组分为前面的有序部分后面的无序部分,
外层循环将有序部分长度 i 从 1 到 n-1 ,
内层循环是将有序部分从后往前遍历,所有比 arr[i] 大的都往后移一位,
最后将 arr[i] 插入到第一个比它小的元素后面,
整个过程很像从扑克牌堆中取牌并插入手中的有序扑克序列的过程,
所以被称为插入排序。
void insertionSort(int arr[], int n) {
int i, j, key;
for (i = 1; i < n; i++) {
key = arr[i];
j = i - 1;
// 将 arr[0..i-1] 中比 key 大的元素都向后移动一个位置
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key; // 将 key 插入插入
}
}
时间复杂度为O(n^2)
空间复杂度为O(1)
虽然时间复杂度和空间复杂度与冒泡排序和选择排序是一样的,
但是插入排序在部分有序的数组比较的次数更少速度更快。