快速排序

快速排序的核心思想是 分治法。

通俗的说,就是将数组中所有小于 枢轴 的元素放在它的左边,大于它的放在它的右边。(枢轴即中轴,即所有元素与之进行比较的元素)

然后再对其左边和右边的数组元素运用同样的方法进行排序。


快速排序1:

#include "stdafx.h"
#include <iostream>
void swap(int *a, int *b){
	int temp;
	temp = *b;
	*b = *a;
	*a = temp;
}
void QuickSeq(int a[],int low,int high){
	
	if (low < high){
		int left = low;
		int right = high;
		int pivot = a[low];//设置枢轴
		while (low < high){ //只要左边和右边还没撞上就不停的进行交换,使得小的元素都归在左边一方,较大的元素归于右边一方
			while (low < high && a[high] >= pivot){ //从最右边找到小于枢轴的元素
				high--;
			}
			while (low < high && a[low] <= pivot){ //从最左边找到大于枢轴的元素
				low++;
			}
			swap(&a[low], &a[high]);//交换较小的和较大的元素
		}
			
		swap(&a[left], &a[low]);//交换枢轴和数组中间的元素,使得数组头的文件在数组中间,小于它的在左边,大于它的在右边

		QuickSeq(a, left, low-1);//所有小于中间元素的一边进行同样的操作
		QuickSeq(a, low+1, right);//所有右边的元素按照同样的方法也进行排序。
	}
	
}

int _tmain(int argc, _TCHAR* argv[])      
{
	int n;
	scanf_s("%d", &n);
	int a[100];

	for (int i = 0; i < n;i++){//输入要排序的数组
		scanf_s("%d", &a[i]);
	}

	QuickSeq(a,0,n-1);//快速排序
	for (int i = 0; i < n; i++){ //输出排好序的数组
		printf("%d ", a[i]);
	}
	system("pause");
	return 0;
}

快速排序2:

#include "stdafx.h"
#include <iostream>
void QuickSeq(int a[], int n, int low, int high){
	int i, j, t;
	if (low < high){
		int i = low;
		int j = high+1;
		while (1){
			while (i + 1 < n && a[++i] < a[low]);	//往右走,找到大于枢轴的元素	
			while (j - 1 >-1 && a[--j] > a[low]); //往左走,找到小于枢轴的元素
			if (i>=j){
				break;//当左边的角码大于右边的角码时,跳出循环。
			}
			t = a[i], a[i] = a[j], a[j] = t;//交换较大和较小元素
		}
		t = a[low], a[low] = a[j], a[j] = t;//将枢轴元素放在数组中间处

		QuickSeq(a, n,low,j-1 );//对枢轴左边的元素进行快速排序
		QuickSeq(a, n,j+1, high);//对枢轴右边的元素进行快速排序
	}

}
int _tmain(int argc, _TCHAR* argv[])
{
	int n;
	scanf_s("%d", &n);
	int a[100];

	for (int i = 0; i < n; i++){
		scanf_s("%d", &a[i]);
	}
	QuickSeq(a, n,0, n - 1);//快速排序
	for (int i = 0; i < n; i++){
		printf("%d ", a[i]);
	}
	system("pause");
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值