排序算法学习笔记1(冒泡、选择、插入)
学习笔记来源于:学习博客链接
一、冒泡排序
两两比较法,升序则大的换到后面,降序就把小的换到后面,代码实现简单,原理易懂,但时间复杂度为O(n^2)
#include <iostream>
using namespace std;
template<typename T> //整数或浮点数皆可使用,若要使用类(class)或结构体(struct)时必须重载大于(>)运算符
void bubble_sort(T arr[], int len) {
int i, j;
for (i = 0; i < len - 1; i++)
for (j = 0; j < len-1 - i; j++)
if (arr[j] > arr[j + 1])
swap(arr[j], arr[j + 1]);
}
int main() {
int arr[] = { 61, 17, 29, 22, 34, 60, 72, 21, 50, 1, 62 };
int len = (int) sizeof(arr) /sizeof(*arr); //计算数组长度
bubble_sort(arr, len);
for (int i = 0; i < len; i++)
cout << arr[i] << ' ';
cout << endl;
return 0;
}
/* 冒泡排序第一遍:i = 0,j从0~len-1,循环后的arr 17,29,22,34,60,61,21,50,1,62,72 ——将最大数放在最后了
冒泡排序第二遍:i = 1,j从0~len-2,循环后的arr 17,22,29,34,60,21,50,61,62,72 ——排了倒数第二大的数
冒泡排序第三遍:i = 2,j从0~len-3,循环后的arr 17,22,29,34,21,50,60,61,62,72
冒泡排序第四遍:i = 3,j从0~len-4,循环后的arr 17,22,29,21,34,50,60,61,62,72
冒泡排序第五遍:i = 4,j从0~len-5,循环后的arr 17,22,21,29,34,50,60,61,62,72
冒泡排序第六遍:i = 5,j从0~len-6,循环后的arr 17,21,22,29,34,50,60,61,62,72
排序算法的时间复杂度为O(n^2)
*/
二、选择排序
选择排序和冒泡排序很像,只是交换时候不是逐个数值交换,而是记录下标然后,需要交换的两个位置交换,不会局限在相邻位置交换,时间复杂度是O(n^2)。
void choose_sort(int arr[],int len){
int min,i,j;
for(i = 0; i < len ; i++)
{
min = i;
for(j = i + 1; j < len; j++)
{
if(arr[j]<arr[min])
{
swap(arr[j],arr[min]);
//min = j;
}
}
}
}
int main() {
int len = (int) sizeof(arr) /sizeof(*arr); //计算数组长度
choose_sort(arr, len);
for (int i = 0; i < len; i++)
cout << arr[i] << ' ';
cout << endl;
return 0;
}
/*61, 17, 29, 22, 34, 60, 72, 21, 50, 1, 62
选择排序第一遍:设0位置为最小,开始比较交换,1,61,29,22,34,60,72,21,50,17,62
选择排序第二遍:设1位置最小,1,17,61,29,34,60,72,22,50,21,62
选择排序第三遍:设2位置最小,1,17,21,61,34,60,72,29,50,22,62
选择排序第四遍:设3位置最小,1,17,21,22,61,60,72,34,50,29,62
选择排序第五遍:设4位置最小,1,17,21,22,29,61,72,60,50,34,62
选择排序第六遍:设5位置最小 ,1,17,21,22,29,61,72,60,50,34,62
选择排序第七遍:设6位置最小,1,17,21,22,29,34,72,61,60,50,62
选择排序第八遍:设7位置最小,1,17,21,22,29,34,50,72,61,60,62
选择排序第九遍:设8位置最小,1,17,21,22,29,34,50,60,72,61,62
选择排序第十遍:设9位置最小,1,17,21,22,29,34,50,60,61,72,62
选择排序第十一遍:设10位置最小,1,17,21,22,29,34,50,60,61,62,72
*/
三、插入排序
插入排序,很像拿牌时候对扑克牌的整理过程,保持从小范围的有序逐渐扩大,然后最终完成整个数组的排序,时间复杂度是O(n^2)。
void insert_sort(int arr[],int len)
{
int i,j;
for(i = 1; i < len; i++)
{
for(int j = i-1; j>=0 ; j--)
{
if(arr[j]>arr[j+1])
swap(arr[j],arr[j+1]);
}
}
}
int main() {
int len = (int) sizeof(arr) /sizeof(*arr); //计算数组长度
insert_sort(arr,len);
for (int i = 0; i < len; i++)
cout << arr[i] << ' ';
cout << endl;
return 0;
}
/*61, 17, 29, 22, 34, 60, 72, 21, 50, 1, 62
插入排序第一遍:17,61,29,22,34,60,72,21,50,1,62
插入排序第二遍:17,29,61,22,34,60,72,21,50,1,62
插入排序第三遍:17,22,29,61,34,60,72,21,50,1,62
插入排序第四遍:17,22,29,34,61,60,72,21,50,1,62
插入排序第五遍:17,22,29,34,60,61,72,21,50,1,62
插入排序第六遍:17,22,29,34,60,61,72,21,50,1,62
插入排序第七遍:17,21,22,29,34,50,60,61,72,1,62
插入排序第八遍:17,21,22,29,34,50,60,61,72,1,62
插入排序第九遍:1,17,21,22,29,34,50,60,61,72,62
插入排序第十遍:1,17,21,22,29,34,50,60,61,62,72
*/