基础排序--冒泡--选择--插入

1、冒泡排序

cpp 复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>

//冒泡排序
void bubblesort(int q[],int N) 
{
	
	int temp = 0;
	for(int i = 0;i<N-1;i++)
	{
		for(int j = 0;j<N-i-1;j++)
		{
			if(q[j]>=q[j+1])  //注意这里不要写成j++ 
			{
				temp = q[j];
				q[j] = q[j+1];
				q[j+1] = temp;
			}
		}
	}
	
}


int main()
{
	int q[5] = {100,500,10,30,455};
	int n = sizeof(q) / sizeof(int);
	bubblesort(q,5);
	
	for(int i = 0;i<n;i++)
	{
		printf("%d ",q[i]);
	}
	
	return 0;
}

2、选择排序

外层大循环是n-1次 (因为是两两对比)

内层小循环是从第二个元素开始

思路:将当前未排序区间的第一个元素,设置为最小值

然后从第二个元素开始对比,然后将对比出的最小值,与这个区间的第一个元素交换即可

cpp 复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>

//冒泡排序
void selectsort(int q[],int N) 
{
	int minIndex = 0;
	int temp;
	for(int i = 0;i<N-1;i++)
	{
		//假设未排序区间第一个元素是最小值
		minIndex = i;
		
		//从第二个元素开始对比 
		 for(int j = i+1;j<N;j++)
		 {
		 	if(q[j]<q[minIndex])
		 	{
		 		minIndex = j;
			 }
		 }
		 
		  // 将找到的最小值与未排序区间的第一个元素交换
		  temp = q[minIndex];
		  q[minIndex] = q[i];
		  q[i] = temp;
		 
		
	}
}



int main()
{
	int q[5] = {1,500,10,30,455};
	int n = sizeof(q) / sizeof(int);
	selectsort(q,5);
	
	for(int i = 0;i<n;i++)
	{
		printf("%d ",q[i]);
	}
	
	return 0;
}

3、插入排序

思路:将数组分为'已排序区间'和'未排序区间',每次从未排序区间取一个元素,插入到已排序区间的合适位置,直到所有元素排序完成

默认第一个元素已排序,从第二个元素开始

设立一个下标 J , 表示已排序区间的最后一位

如果 J 的值 大于当前要比较的值,那么我们将 q【j】这一位往后移,同时 j-- ,继续向前比较

如果不用再比较了,那么直接让q[j+1]这一位原来的 q【j】 的值变成current的值即可

cpp 复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>

//插入排序
void insertsort(int q[],int n)
{
	int i,j,current;
	//未排序区间的第一个元素(从1开始,0号元素默认已排序)
	for(i=1;i<n;i++)
	{
		current = q[i];
		j = i-1;  //j是已排序区间末尾下标 
	
	//内层循环
	while(j>=0 && q[j] > current)
	{
		q[j+1] = q[j]; //元素后移一位 
		j--; //继续向前比较 
	 } 
	 
	   // 将current插入到正确位置(j+1是插入索引)
	   q[j+1] = current;
}
 } 

int main()
{
	int q[5] = {1,500,1022,30,455};
	int len = sizeof(q) / sizeof(q[0]);
	insertsort(q,len);
	
	for(int i = 0;i<len;i++)
	{
		printf("%d ",q[i]);
	}
	
	return 0;
}
相关推荐
零小陈上(shouhou6668889)8 分钟前
K-近邻算法 - lazy learning的代表
算法·近邻算法
有一个好名字14 分钟前
力扣-从字符串中移除星号
java·算法·leetcode
萧瑟其中~18 分钟前
二分算法模版——基础二分查找,左边界查找与右边界查找(Leetcode的二分查找、在排序数组中查找元素的第一个位置和最后一个位置)
数据结构·算法·leetcode
码上就好ovo20 分钟前
Atcoder Beginnner Contest 440
算法
高洁0127 分钟前
CLIP 的双编码器架构是如何优化图文关联的?(3)
深度学习·算法·机器学习·transformer·知识图谱
jllllyuz33 分钟前
MATLAB实现蜻蜓优化算法
开发语言·算法·matlab
iAkuya35 分钟前
(leetcode)力扣100 36二叉树的中序遍历(迭代递归)
算法·leetcode·职场和发展
wangwangmoon_light43 分钟前
1.1 LeetCode总结(线性表)_枚举技巧
算法·leetcode·哈希算法
码农小韩1 小时前
基于Linux的C++学习——动态数组容器vector
linux·c语言·开发语言·数据结构·c++·单片机·学习