数据结构——交换排序(冒泡排序和快速排序。)

news/2024/5/19 21:45:24 标签: 数据结构, 排序算法, 快速排序

交换排序

所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。

冒泡排序

1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3、针对所有的元素重复以上的步骤,除了最后一个。
4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

//冒泡排序

#include<stdio.h>

void bubble_sort( int a[],int n)
{
    int m,j,flag=1;
    int temp;
    for(m=1;m<n&&flag==1;m++)
    {   
	    flag=0; 
    	for(j=1;j<=n-m;j++)
    	{
    		if(a[j+1]<a[j])
    		{
    			flag=1;
    			temp = a[j];
    			a[j]=a[j+1];
    			a[j+1]=temp;
			 } 
		}
	}

 } 
 int main()
{
	int i;
	int a[9];
	for( i =1;i<=8;i++)
	{
		a[i]=8-i;
	}
	for(i = 1;i<=8;i++)
	{
		printf("a[%d]=%d\n",i,a[i]);
	}
	bubble_sort(a,9);
	for(i=1;i<=8;i++)
	{
		printf("a[%d]=%d\n",i,a[i]);
	}
	return 0;
	
	 
 }

在这里插入图片描述

快速排序

快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
快速排序算法通过多次比较和交换来实现排序,其排序流程如下:
(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。
(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

#include<stdio.h>



int Partition(int a[],int low, int high) 

{
	a[0]=a[low];
	while(low<high)
	{
		while(low<high&& a[0]<=a[high]) high--;
		a[low]=a[high];
		while(low<high && a[low]<=a[0])low++;
		a[high]=a[low]; 
	}
	a[low]=a[0];
	return low;
	
}
void Qsort( int a[],int low,int high)
{
	int pivotloc;
	if(low<high)
	{
		pivotloc = Partition(a,low,high);
		Qsort(a,low,pivotloc-1);
		Qsort(a,pivotloc+1,high);
	}
}


 int main()
{
	int i;
	int low=1,high=8;
	int a[9]={0,49,38,65,97,76,12,27,49};
	for(i = 1;i<=8;i++)
	{
		printf("a[%d]=%d\n",i,a[i]);
	}
	Qsort(a,low,high);
	for(i=1;i<=8;i++)
	{
		printf("a[%d]=%d\n",i,a[i]);
	}
	return 0;
	
	 
 }

在这里插入图片描述

之后左子表和右子表递归的执行,直到子表中的元素为一个为止。


http://www.niftyadmin.cn/n/1712913.html

相关文章

12. 异步回调

CompletableFuture 在 Java 里面被用于异步编程&#xff0c;异步通常意味着非阻塞&#xff0c;可以使得我们的任务单独运行在与主线程分离的其他线程中&#xff0c;并且通过回调可以在主线程中得到异步任务的执行状态&#xff0c;是否完成&#xff0c;和是否异常等信息 类中的…

数据结构————哈希表的实现(语言)

哈希表 散列表&#xff08;Hash table&#xff0c;也叫哈希表&#xff09;&#xff0c;是根据关键码值(Key value)而直接进行访问的数据结构。也就是说&#xff0c;它通过把关键码值映射到表中一个位置来访问记录&#xff0c;以加快查找的速度。这个映射函数叫做散列函数&…

排序算法(对三个数进行排序三指针)

思路 采用三个指针 1&#xff09;头指针之前都是第一个数 2&#xff09;尾指针之后都是地三个数 3&#xff09;两个指针之间是第二个数 看一下例子&#xff1a; 例如对{1&#xff0c;0&#xff0c;0&#xff0c;2&#xff0c;2&#xff0c;1&#xff0c;0&#xff0c;2}进行排…

Java后端对 前端的学习了解 ,基础知识和各框架功能发展概述,以及了解前后端的分离史

Bootstrap可视化布局系统 (bootcss.com) 这是一个创建可视化布局的生成前端代码&#xff0c;根据你的需要&#xff0c;拖到按钮&#xff0c;然后就可以复制生成的代码 提示&#xff1a;学习一门技术&#xff0c;最好的方式就是官方文档&#xff0c;可以看完视频&#xff0c;笔…

数据结构————栈(力扣)

栈 来源&#xff1a;1381. 设计一个支持增量操作的栈 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode-cn.com/problems/design-a-stack-with-increment-operation typedef struct { int *a; //用数组表示一个栈int size; //…

Vue 的七大 常用属性

1.el属性 用来指示vue编译器从什么地方开始解析 vue的语法&#xff0c;可以说是一个占位符。 相当于一个容器&#xff0c;跟上面的div id "app"做关联&#xff0c;从此以后上面div id "app"里面的内容要通过vue来渲染,都要经过vue处理才能看得到上面div里…

C语言实现LRU缓存机制——哈希表+双向链表

题目描述 题目来源&#xff1a; https://leetcode-cn.com/problems/lru-cache/ 运用你所掌握的数据结构&#xff0c;设计和实现一个LRU&#xff08;最近最少使用&#xff09;缓存机制。它应该支持以下操作&#xff1a;获取数据get和写入数据 put。 获取数据get&#xff08;key…

吴恩达课程第二周01作业Python Basics with Numpy (optional assignment)

Python Basics with Numpy (optional assignment) 1、sigmoid函数 也叫Logistic函数&#xff0c;用于隐层神经元输出&#xff0c;取值范围为(0,1)&#xff0c;它可以将一个实数映射到(0,1)的区间&#xff0c;可以用来做二分类。在特征相差比较复杂或是相差不是特别大时效果比…