经典排序算法

博主还是萌新,不足之处请多多指正

排序算法

在这里插入图片描述
一、选择排序

思想:每次选择数组中的最大值(最小值)元素,将其与前面未排序数组元素进行互换。

在这里插入图片描述
算法:

#include<stdio.h>

int main(void){
	int i, j;
	int a[10];
	int temp, ipos;
	int n;
	
	/*赋值*/
	scanf("%d", &n);
	for(i = 0; i < n; i++){
		scanf("%d", &a[i]);
	}
	
	/*从大到小排序*/
	for(i = 0; i < n; i++){
		temp = a[i];                //设当前元素为最大值 
		ipos = i;                   //获取当前元素位置 
		
		for(j = i+1; j < n; j++){   //遍历比较大小 
			if(a[j] > temp){
				temp = a[j];
				ipos = j;
			}
		}
		
		a[ipos] = a[i];//较换 
		a[i] = temp;
	}
	
	/*遍历输出*/
	for(i = 0; i < n; i++){
		if(i == n-1){
			printf("%d", a[i]);
		}else{
			printf("%d ", a[i]);
		}
	}
	
	return 0;
} 

运行结果:
在这里插入图片描述
二、冒泡排序

思想:每次比较数组中相邻两个元素的值将较大(或较小)的元素放在前面。

在这里插入图片描述
算法:

#include<stdio.h>

int main(void){
	int i, j;
	int a[10];
	int temp;
	int n;
	
	/*赋值*/
	scanf("%d", &n);
	for(i = 0; i < n; i++){
		scanf("%d", &a[i]);
	}
	
	/*从大到小排序*/
	for(i = 0; i < n; i++){
		for(j = n-1; j > i; j--){
			
			if(a[j] > a[j-1]){//遍历比较大小 
				temp = a[j-1];
				a[j-1] = a[j];
				a[j] = temp;
			}
		}
	}
	
	/*遍历输出*/
	for(i = 0; i < n; i++){
		if(i == n - 1){
			printf("%d", a[i]);
		}else{
			printf("%d ", a[i]);
		}
	}
	
	return 0;
} 

运行结果:
在这里插入图片描述
三、交换排序

思想:将数组中每一位元素与其后的所有元素一一比较,根据条件进行互换。

算法:

#include<stdio.h>

int main(void){
	int i, j;
	int a[10];
	int temp;
	int n;
	
	/*赋值*/
	scanf("%d", &n);
	for(i = 0; i < n; i++){
		scanf("%d", &a[i]);
	}
	
	/*从大到小排序*/
	for(i = 0; i < n; i++){
		for(j = i+1; j < n; j++){
			
			if(a[j] < a[i]){//遍历比较大小 
				temp = a[i];
				a[i] = a[j];
				a[j] = temp;
			}
		}
	}
	
	/*遍历输出*/
	for(i = 0; i < n; i++){
		if(i == n - 1){
			printf("%d", a[i]);
		}else{
			printf("%d ", a[i]);
		}
	}
	
	return 0;
} 

运行结果:
在这里插入图片描述
四、插入排序

思想:在数组中抽出一个元素,在前面的元素中寻找相应的位置插入。

在这里插入图片描述
算法:

#include<stdio.h>

int main(void){
	int i, j;
	int a[10];
	int temp, ipos;
	int n;
	
	/*赋值*/
	scanf("%d", &n);
	for(i = 0; i < n; i++){
		scanf("%d", &a[i]);
	}
	
	/*从大到小排序*/
	for(i = 0; i < n; i++){
		temp = a[i];                           //选择要插入的元素 
		ipos = i - 1;
		
		while((ipos >= 0) && (temp < a[ipos])){//寻找插入位置并插入 
			a[ipos+1] = a[ipos];
			ipos--;
		}
		
		a[ipos+1] = temp;
	}
	
	/*遍历输出*/
	for(i = 0; i < n; i++){
		if(i == n - 1){
			printf("%d", a[i]);
		}else{
			printf("%d ", a[i]);
		}
	}
	
	return 0;
} 

运行结果:
在这里插入图片描述
五、快速排序

思想:先选择一个基准值,然后把比基准值小的放一边,比基准值大的放另一边。最后对两边分别递归,重复这个过程。
注:基准值一般选择中间值

算法:

#include<stdio.h>

void CelerityRun(int left, int right, int array[]);

int main(void){
	int i, j;
	int a[10];
	int temp, ipos;
	int n;
	
	/*赋值*/
	scanf("%d", &n);
	for(i = 0; i < n; i++){
		scanf("%d", &a[i]);
	}
	
	/*从大到小排序*/
	CelerityRun(0, n-1, a);	
	
	/*遍历输出*/
	for(i = 0; i < n; i++){
		if(i == n - 1){
			printf("%d", a[i]);
		}else{
			printf("%d ", a[i]);
		}
	}
	
	return 0;
} 

void CelerityRun(int left, int right, int array[]){
	int i, j;
	int middle, temp;
	
	i = left;
	j = right;
	middle = array[(left+right) / 2];  //基准数
	
	do{
		while((array[i] > middle) && (i < right)){  //从左边找小于基准数的元素 
			i++;
		}
		while((array[j] < middle) && (j > left)){   //从右边找大于基准数的元素 
			j--;
		}
		
		if(i <= j){
			temp = array[i];
			array[i] = array[j];
			array[j] = temp;
			i++;
			j--;
		}
	} while (i <= j);//两下标交错时停止 
	
	/*对左右半边分别递归操作*/
	if(left < j){
		CelerityRun(left, j, array);
	}
	if(right > i){
		CelerityRun(i, right, array);
	}
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值