排序算法学习笔记1(冒泡、选择、插入 C++)

排序算法学习笔记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 
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值