ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

学习笔记一

2021-11-29 23:07:06  阅读:166  来源: 互联网

标签:遍历 int quicksort 笔记 学习 ++ 基点 排序


快速排序简单思路及程序

输入n个数,将其进行又小到大的排序

首先输入n个数,并将其保存到数组a[n]中。

例如我有以下一组数:

12345
345778954

首先我们要理解什么是快速排序?

它是由冒泡排序演变而来,人们在进行大规模排序运算时便发现使用冒泡法排序所消耗的时间太长,运算次数达到了O(n^2)。于是就有了快速排序的诞生,其运算级也缩减到O(n log n)。

冒泡排序是从左到右与相邻的数比较互换,多次遍历取得结果,而快速排序则是先找到一个基点,利用程序,将数组中小于它的值都排到它的左边,大于它的数都排到它的右边,利用递归思想,以它为分界点将其分为两个数组,重复操作,直至其左右两边都只有一个数值时,停止,这是从左到右的快速排序就完成了。

先定义一个变量t,用来存放基点值。再定义两个变量用来遍历:

345778954
i-><-j

从j开始依次遍历下去,直至其所对应的值小于基点值,并将a[i]=a[j],如图所示:

95778954
i->j

又从i开始遍历,直至找到其所对应的值大于基点值,又将a[j]=a[i],

如图所示:

957785754
i<-j

用循环重复此操作,直至i=j时停止。

957785754
i、j

此时可以确保其i左边的值均小于基点值,其j右边的值均大于基点值,因此此时i与j所在的位置便是基点值在这组数组中所占据的位置,再将a[i]=t。

在以该基点值为界,对其左右两边的值分别进行此操作,直至其基点值两边只剩下一个数值。(用递归实现)

代码如下:

#include<iostream>
using namespace std;
void quicksort(int *a,int b,int c)
{
	int n = a[b], i = b, j = c;
	if (b >= c)
		return;
	while (i < j)
	{
		while (a[j] > n && j > i)
			j--;
		a[i] = a[j];
		while (a[i]<n && j>i)
			i++;
		a[j] = a[i];
	}
	a[i] = n;
	quicksort(a, b, i - 1), quicksort(a, j + 1, c);
}
int main()
{
	int a[100] = { 0 }, n;
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> a[i];
	quicksort(a, 0, n - 1);
	for (int i = 0; i < n; i++)
		cout << a[i] << ' ';
	return 0;
}

标签:遍历,int,quicksort,笔记,学习,++,基点,排序
来源: https://blog.csdn.net/ftmht/article/details/121621846

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

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

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

ICode9版权所有