《数据结构》练级-冒泡排序

本文详细介绍了冒泡排序算法的基本原理及实现方式,并给出了具体的代码示例。包括原始冒泡排序和改进版冒泡排序,后者通过引入标志位来提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

冒泡排序:

/*  
================================================  
 功能:冒泡排序  
 输入:数组名称(也就是数组首地址)、数组中元素个数  
================================================  
*/  
/*  
====================================================  
算法思想简单描述:  
  
 在要排序的一组数中,对当前还未排好序的范围内的全部数,自上  
 而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较  
 小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要  
 求相反时,就将它们互换。  
    
 下面是一种改进的冒泡算法,它记录了每一遍扫描后最后下沉数的  
 位置k,这样可以减少外层循环扫描的次数。  
  
 冒泡排序是稳定的。算法时间复杂度O(n2)--[n的平方]  
=====================================================  
*/  
  
void bubble_sort(int *x, int n)  
{  
 int j, k, h, t;  
     
 for (h=n-1; h>0; h=k) /*循环到没有比较范围*/  
 {  
  for (j=0, k=0; j<h; j++) /*每次预置k=0,循环扫描后更新k*/  
  {  
  if (*(x+j) > *(x+j+1)) /*大的放在后面,小的放到前面*/  
  {  
  t = *(x+j);  
  *(x+j) = *(x+j+1);  
  *(x+j+1) = t; /*完成交换*/  
  k = j; /*保存最后下沉的位置。这样k后面的都是排序排好了的。*/  
  }  
  }  
 }  
}  

例:

//利用冒泡排序法对输入的10个整数从小到大排序,显示出每步的排序过程,打印最终结果
//采用一维数组表示这10个数
#include "stdio.h"
#define N 10 

int main() {

	int i, j, temp;
	int a[N+1];
	int count = 0;// 记数器,记录是第几趟排序

	printf( " Please enter %d date: \n", N );
	for (i = 1; i <= N; i++)
	scanf( " %d", &a[i]);

	printf( "************************\n");
	
	for (i = 1; i <= N; i++) {

		count++;//第记录一趟,计数器加1
		for ( j=1; j<=N; j++) {//若相邻两数 左边 大于 右边 则交换
			
			if (a[j] > a[j+1])	{ temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; }

		}
		//打印第几趟和本趟排序结果	
		printf( "%3d:", count);
		for (j = 1; j <= N; j++)
		printf( "%d ",a[j]); printf( " \n ");

	}

	//打印最终的排序结果
	printf( " The result is :");
	for (i = 1; i <= 10; i++);
	printf( "%d",a[i]);
	return 0;
}

改进后的冒泡排序:

//设置一个标志flag,一旦发现在某趟无需交换数据,即提前跳出循环,终止排序,修改后的程序如下:

#include "stdio.h"
#define N 10 

int main() {

	int i,j,temp;
	int a[N+1];
	int count=0;
	int flag;

	printf( " Please enter %d date: \n", N );
	for(  i=1; i<=N; i++)
	scanf( " %d", &a[i]);

	printf( "************************\n");
	
	flag=1;//默认整个排序过程有交换	
	for( i=1; i<=N&&flag; i++) {
		
		flag=0;
		for( j=1; j<=N; j++) {
			
		if(a[j]>a[j+1])	{ 
				flag=1;//当前趟有交换
				temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; }

		}
		
		if(flag) {//判断是否需打印呢?

			count++;
			printf( "%3d:", count);
			for( j=1; j<=N; j++)
			printf( "%d ",a[j]); printf( " \n ");

		}
	}

	//打印最终的排序结果
	printf( " The result is :");

	for( i=1; i<=10; i++);
	printf( "%d\n",a[i]);

	return 0;
}

编程风格思考:

1、输入、输出的人性化。良好的提示、错误提醒……
2、方法的可扩展性?自定义数组(数据个数、类型)排序
3、测试用例

### Vue 3 中使用 Element Plus 实现级联选择器 (Cascader) 在 Vue 3 和 Element Plus 的组合下,可以方便地创建一个用于显示省市区的级联选择器。这不仅限于三级结构,还可以扩展到更多的级别。 #### 安装依赖 为了开始构建应用,需安装必要的库: ```bash npm install vue@next npm install element-plus ``` 确保项目配置支持按需加载组件以优化性能[^1]。 #### 创建 Cascader 组件实例 定义数据源 `options` 来表示不同级别的选项列表。对于省市区的选择场景来说,这些通常是预先准备好的 JSON 数据或者通过 API 动态获取的数据集。 下面是一段简的代码片段展示了如何初始化并渲染一个带有默认值的级联选择框: ```html <template> <el-cascader :options="options" v-model="selectedOptions"></el-cascader> </template> <script setup lang="ts"> import { ref } from &#39;vue&#39;; // 示例省份城市区县数据 const options = [ { value: &#39;zhejiang&#39;, label: &#39;浙江&#39;, children: [{ value: &#39;hangzhou&#39;, label: &#39;杭州&#39;, children: [{value:&#39;xihu&#39;,label:&#39;西湖&#39;}], }], }, ]; let selectedOptions = ref([]); </script> ``` 此模板中的 `el-cascader` 是来自 Element Plus 的组件标签名;`:options` 属性绑定到了本地状态变量 `options` 上面,而 `v-model` 则用来双向绑定选中项至另一个响应式的数组 `selectedOptions`。 当用户交互时,所选路径会自动更新到该模型上,并且可以通过监听事件进一步处理逻辑操作。 #### 自定义样式与功能增强 如果希望自定义外观或增加额外的功能特性(比如搜索过滤),可以根据官方文档提供的参数来进行调整。例如,添加属性 `filterable` 启用筛选模式,使输入框能够快速定位目标节点[^2]。 此外,也可以利用插槽机制来定制内部布局或是覆盖默认的行为表现形式。 #### 处理异步加载子项 针对大型树状结构下的延迟加载需求,可通过设置 `lazy` 参数配合 `loadData` 方法实现懒加载效果。每当展开某个父节点前都会触发对应的回调函数去请求新的子元素集合。 ```javascript { lazy: true, loadData(node, resolve) { setTimeout(() => { const nodes = Array.from({ length: 3 }, (_, i) => ({ value: `${node.value}-${i}`, label: `Item ${i}` }) ); resolve(nodes); }, 500); // 模拟网络延时 } } ``` 以上就是基于 Vue 3 和 Element Plus 构建多级联动选择控件的基础指南。实际开发过程中可根据具体业务要求灵活运用框架所提供的各项能力完成更复杂的应用设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值