ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

排序算法(2)-- 快速排序,冒泡排序

2019-09-07 17:43:59  阅读:219  来源: 互联网

标签:tmp arr int 冒泡排序 算法 low 排序


冒泡排序使我们开始最先接触到的一种排序算法,这里对其进行简单的说明以及现对于冒泡排序的一种改进算法快速排序,是在冒泡排序的基础上进行改进。

  • 冒泡排序
  • 快速排序

这里先对冒泡排序进行说明
1.冒泡排序:从待排组中第一个数字A[j],其中j=0开始,依次与它后面A[j+1]的数字进行比较,如果小于第一个元素,则交换位置,将大的数字放在后面(石头向下沉),循环将第一个最大的数字放在数组最后面,比较趟数减一,即通过与后面元素的比较将最大的数字依次放在后面,最小的放在前面即可。
冒泡优化处理:当该待排序组原本就是有序时,不需要进行交换, 为了减少时间复杂度,可以设置一个标记flg,初始化为false,当前两个元素不相等时,将其置为true,每一趟排序完成后,判断 !flg 是否成立,成立则不返回 什么。

在这里插入图片描述

2.快速排序:快速排序是对冒泡排序的一种优化,初四是将第一个元素作为基准,一趟排序结果是将待排数组分为两个部分,处于基准左边的是小于它的数字,处于右边的是大于基准的数字。目标是将其移到坐标为K的位置。递归地对两个序列进行快速排序,直到序列为空或者只有一个元素。

在这里插入图片描述
对于快排的基准的选择有不同的方法,时间复杂度,效率上有所不同,上述为基本的定位基准的方法,其他方法还需要进行理解。

//冒泡排序
#include<stdio.h>

void BubbleSort(int *arr,int len)//时间复杂度O(n^2)
{
	int tmp;
	int i;
	for(i=0;i<len-1;i++)//趟数
	{
		for(int j=0;j<len-1-i;j++)//-i!!!每沉入一个,比较的数字个数减一
		{
			if(arr[j]>arr[j+1])
			{
				tmp=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=tmp;
			}
		}
	}
}


void BubbleSort1(int *arr,int len)//冒泡优化//有序 1 2 3 4 5 6 时间复杂度O(n)
{
	int tmp;
	bool flg=false;
	int i;
	for(i=0;i<len-1;i++)//有序 1 2 3 4 5 6 避免交换
	{
		bool flg=false;
		for(int j=0;j<len-1-i;j++)
		{
			if(arr[j]>arr[j+1])
			{
				tmp=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=tmp;
				flg=true;
			}
		}
		if(!flg)
		{
			return;
		}
	}
}

void Show(int *arr,int len)
{
	for(int i=0;i<len;i++)
	{
		printf("%3d",arr[i]);
	}
	printf("\n");
}

int main()
{
	int arr[]={20,33,21,54,17,16,30,18,19,22,7,10,46,12,15};
	
	BubbleSort(arr,sizeof(arr)/sizeof(arr[0]));
	
	Show(arr,sizeof(arr)/sizeof(arr[0]));

	return 0;
}

//快速排序
#include<stdio.h>
//快排一次划分
int Partition(int *arr,int low,int high)//O(n),O(1) 
{
	int tmp = arr[low];//基准
	while(low < high)
	{
		while(low<high && arr[high]>tmp)
		{
			high--; 
		}
		arr[low] = arr[high];
		while(low<high && arr[low]<tmp)
		{
			low++;
		}
		arr[high] = arr[low];
	}

	arr[low] = tmp;//low==high
	return low;
}

static void Quick(int*arr,int low,int high)
{
	int par = Partition(arr,low,high);
	if(low+1 < par)//左边至少两个数据
	{
		Quick(arr,low,par-1);
	}
	if(par+1 < high)//右边至少两个数据
	{
		Quick(arr,par+1,high);
	}
}

void QuickSort(int *arr,int len)//O(nlogn),O(logn)***,不稳定
{
	Quick(arr,0,len-1);
}

void Show(int *arr,int len)
{
	for(int i=0;i<len;i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n");
}


int main()
{
	int arr[] = {4,9,0,12,34,67,8,91,32,54,66,88,2};
	QuickSort(arr,sizeof(arr)/sizeof(arr[0]));
	Show(arr,sizeof(arr)/sizeof(arr[0]));

	return 0;
}

标签:tmp,arr,int,冒泡排序,算法,low,排序
来源: https://blog.csdn.net/weixin_43212052/article/details/100592493

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有