交换排序(快速排序 冒泡排序)

1.快速排序:先从数列中取出一个数作为基准数分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边再对左右区间重复第二步,直到各区间只有一个数。

 

以一个数组作为示例,取区间第一个数为基准数。

0

1

2

3

4

5

6

7

8

9

72

6

57

88

60

42

83

73

48

85

初始时,i = 0;  j = 9;   X = a[i] = 72

由于已经将a[0]中的数保存到X中,可以理解成在数组a[0]上挖了个坑,可以将其它数据填充到这来。j开始向前找一个比X小或等于X的数。当j=8,符合条件,将a[8]挖出再填到上一个坑a[0]中。a[0]=a[8]; i++;  这样一个坑a[0]就被搞定了,但又形成了一个新坑a[8],这怎么办了?简单,再找数字来填a[8]这个坑。这次从i开始向后找一个大于X的数,当i=3,符合条件,将a[3]挖出再填到上一个坑中a[8]=a[3]; j--;i=5时,由于i==j退出。此时,i = j = 5,而a[5]刚好又是上次挖的坑,因此将X填入a[5]

/*快速排序*/ 
#include <iostream>
using namespace std;

const int MAXN = 100;
int n;
void quick_sort(int s[], int left, int right)
{
	if(left<right)
	{
		int pole = s[left];
		int i = left;
		int j = right;
		while(i<j)
		{
			while(i<j&&s[j]>=pole)//while(i<j&&s[j]<=pole)
			{//从后向前寻找可以填前面第i个坑的 
				j--;
			}
			s[i] = s[j];//把第j 个填到了前面,第j个空缺 
			while(i<j&&s[i]<pole)//while(i<j&&s[i]>pole)
			{
				i++;
			}
			s[j] = s[i];
		}
		s[i] = pole;
		
//		for(int k = 0; k<n-1; k++)//输出过程 
//		printf("%d ",s[k]);
//		printf("%d\n",s[n-1]);
		
		quick_sort(s, left, i-1);
		quick_sort(s, i+1, right);
	}//left == right;
}
 
int main() 
{
	int s[MAXN];
	scanf("%d",&n);
	for(int i = 0; i<n; i++)
	{
		scanf("%d",&s[i]);
	}
	quick_sort(s, 0, n-1);
	
	for(int k = 0; k<n-1; k++)
	printf("%d ",s[k]);
	printf("%d\n",s[n-1]);
	
	return 0;
} 

二.交换排序

冒泡排序:冒泡排序是最简单的排序之一了,其大体思想就是通过与相邻元素的比较和交换来把小的数交换到最前面。这个过程类似于水泡向上升一样,因此而得名。举个栗子,对5,3,8,6,4这个无序序列进行冒泡排序。首先从后向前冒泡,46比较,把4交换到前面,序列变成5,3,8,4,6。同理48交换,变成5,3,4,8,6,34无需交换。53交换,变成3,5,4,8,6,3.这样一次冒泡就完了,把最小的数3排到最前面了。对剩下的序列依次冒泡就会得到一个有序序列。冒泡排序的时间复杂度为O(n^2)

/*冒泡排序*/
#include <iostream>
using namespace std;
const int MAXN = 100;

void swap(int arr[], int i, int j)
{
	int temp = arr[i];
	arr[i] = arr[j];
	arr[j] = temp;
}

void Print(int arr[], int n, int i)
{
	printf("%d: ",i);
	for(int j = 0; j<n-1; j++)
	{
		printf("%d ",arr[j]);
	}
	printf("%d\n",arr[n-1]);
}

void BubbleSort(int arr[], int n)
{
	for(int i = 0; i<n-1; i++)//进行n-1次,每一次都会定下一个最小的 
	{
		for(int j = n-1; j>i; j--)
		{
			if(arr[j]<arr[j-1])
			swap(arr, j-1, j);
		}
		Print(arr, n, i+1);
	}
}

int main()
{
	int arr[MAXN], n;
	scanf("%d",&n);
	for(int i = 0; i<n; i++)
	{
		scanf("%d",&arr[i]);
	}
	BubbleSort(arr, n);
}  

快速排序讲解部分来自:http://blog.csdn.net/morewindows/article/details/6684558讲的很清楚推荐!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值