写在前面
最近复习算法的东西。于是在网上查找相关资料,重新了解下几种常见的排序算法。(表格中空白的地方,待了解到那里来的时候再填上?)
一、选择排序
简单的说就是每次都去查找数组中最小的指放在最前面。看了下面这个动图应该就一目了然了。
void selectionSort(int arr[], int len)
{
for (int i = 0 ; i < len - 1 ; i++)
{
int min = i;
for (int j = i + 1; j < len; j++)
if (arr[j] < arr[min])
min = j;
int temp = arr[min];
arr[min] = arr[i];
arr[i]=temp;
}
}
复制代码
这个排序要进行2次循环,所以时间复杂度为O(n²),并没有开辟新的存储空间,所以空间复杂度为O(1)。这种排序是不稳定的,在交换的时候,有可能会更改2个相同数据的位置。比如[5(1),5(2),1]
这样一个数组。在进行遍历的后就会变成[1,5(2),5(1)]
第1个5就被交换到了第2个5的后面。
二、冒泡排序
冒泡排序就是比较相邻的两个数,如果顺序错误就交换一下。这样就不停的把大的数往后面送,然后从数组的末尾到头部依次排好序。由于冒泡排序只是相邻的两个数相交换,所以这个排序算法是稳定的。
void bubbleSort(int arr[],int len)
{
for (int i=0; i<len - 1; i++) {
for (int j=0; j<len-1-i; j++) {
if (arr[j]>arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1]=temp;
}
}
}
}
复制代码
举个例子:
arr = [6, 1, 5, 3, 7] 第一次外循环
变化 | 交换 |
---|---|
( 6 1 5 3 7 ) → ( 1 6 5 3 7 ) | 6 > 1 交换位置 |
( 1 6 5 3 7 ) → ( 1 5 6 3 7 ) | 6 > 5 交换位置 |
( 1 5 6 3 7 ) → ( 1 5 3 6 7 ) | 6 > 3 交换位置 |
( 1 5 3 6 7 ) → ( 1 5 3 6 7 ) | 6 < 7 位置不变 |
第二次外循环(除开最后一个元素8,对剩余的序列)
变化 | 交换 |
---|---|
( 1 5 3 6 7 ) → ( 1 5 3 6 7 ) | 1 < 5 位置不变 |
( 1 5 3 6 7 ) → ( 1 3 5 6 7 ) | 5 > 3 交换位置 |
( 1 3 5 6 7 ) → ( 1 3 5 6 7 ) | 5 < 6 位置不变 |
第三次外循环
变化 | 交换 |
---|---|
( 1 3 5 6 7 ) → ( 1 3 5 6 7 ) | 1 < 3 不变 |
( 1 3 5 6 7 ) → ( 1 3 5 6 7 ) | 3 < 5 不变 |
第四次外循环(最后一次)
变化 | 交换 |
---|---|
( 1 3 5 6 7 ) → ( 1 3 5 6 7 ) | 1 < 3 不变 |
下次再见...