今天学了几个排序算法(一)

这篇博客介绍了几种经典的排序算法,包括冒泡排序、选择排序、直接插入排序、希尔排序和归并排序。详细阐述了每种排序算法的思想和实现,并展示了代码示例。此外,还提到了Markdown编辑器的新功能,如界面设计、代码高亮、图片拖拽、KaTeX数学公式和甘特图等。
摘要由CSDN通过智能技术生成

(本篇实现均为升序)
在这里插入图片描述
1.冒泡排序
最经典的排序算法。其思想是遍历未排序序列,通过比较相邻元素的值从而实现每次循环后将未排序序列中的最大值(构建升序序列)移至最后,后面的序列就是自动形成的有序序列,之前的序列被看做为排序序列。
算法实现:

int* bubble_sort(int arr[], int len){
	   bool flag = false;
	   for(int i = 0;i < len - 1; i++){
			for(int j = 0;j < len - 2 - i;j++){
				if(arr[j] > arr[j + 1]){
					int temp = arr[j];
              		arr[j] = arr[j + 1];
             		arr[j + 1] = temp; 
             		flag = true;
				}
        	}
        	if(!flag){
        		break;
        	}
        	flag = false;
		}
		return arr;
}

2.选择排序
应该是人们最容易想到的算法,其思想将序列分为有序和未排序两部分,初始的未排序序列就是该序列整体,每次从未排序序列中选取最小的数,与数组前面的元素依次进行交换形成有序序列,直至遍历完毕。
算法实现:

int* select_sort(int arr[], int len){
	for(int i = 0;i < len - 1;i++){
		int min = i; 
		for(int j = i;j < len - 1;j++){
			if(arr[j] < arr[min]){
				min = j;
			}
		}
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}
}

3.直接插入排序
直接插入排序基本的思想是递归,将数组看做一个有序序列和一个无序序列,最开始有序序列只有一个元素arr[0],其余构成无序序列,每次从无序序列中取出一个元素插入有序序列恰当位置,使之成为有序序列,重复n-1次即可完成排序。
算法实现:

int* dire_insert_sort(int arr[], int len){
	for(int i = 0;i < len - 1;i++){
		int cur = arr[i + 1];
		int pre = i;
		do{
			arr[pre + 1] = arr[pre];
			pre--;
		}while(temp < arr[j] && j >= 0);
		arr[pre + 1] = cur;
	}
}

4.希尔排序
采用了增量减小的排序思想,increment的取值一直有争议,此处increment初始值为len/3取下限+1
通过increment构成划分,再对分别划分进行直接插入,直至increment增量小于等于1

int* shell_sort(int arr[], int len){
	do{
		increment = len / 3 + 1;
		for(int  i = increment;i < len - 1;i++){
			if(arr[i - increment] > arr[i]){
				int temp = arr[i];
				int j = i - increment;
				do{
					arr[j] = arr[i];
					j -= increment;
				}while(arr[j] > temp && j >= 0);
				arr[j + increment] = temp;
			}
		}
	}while(increment > 1);
}

5.归并排序
采用了分而治之的思想,将序列看做左右两边,利用递归方法对左右两边排序,最终合并为一个有序序列

int* merger_sort(int arr[], int len){
    if(len < 2){
        return arr;
    }
    int middle = len / 2;
    int* left;
    int* right;
    for(int i = 0;i < len - 1;i++){
        if(i < middle){
            left[i] =  arr[i];
        }else{
            right[i - middle] = arr[i];
        }
    }
    return merge(merger_sort(left, middle), merger_sort(right, len - middle), middle, len - middle);
}

int *merge(int* left, int* right,int llen, int rlen){
    int i = 0;
    int j = 0;
    int k = 0;
    int* result;
    while(i <= llen - 1 && j <= rlen - 1){
        if(left[i] <= right[j]){
            result[k] = left[i];
            i++;
        }else{
            result[k] = right[j];
            j++;
        }
        k++;
    }
    while(i <= llen - 1){
        result[k] = left[i];
        i++;
        k++;
    }
    while(j < rlen - 1){
       result[k] = right[j];
       j++;
       k++;
    }
    return result;
}

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值