快速排序



快序排序

       快速排序是由冒泡排序改进得到的。在冒泡排序过程中,只能元素对相邻的两个元素进行比较,所以一趟下来只能消除两个逆序的,快速排序是通过两个不相邻的元素进行比较,一趟下来可以消除多个逆序。

原始数列:{ 13  28  70  59  94  89  10  76  51  1 };

╋╬╋╬╋╬╋╬╋╬╋╬╋╬╋华丽的分界线╋╬╋╬╋╬╋╬╋╬╋╬╋╬╋

定义三个变量,key = 13 【整体的第一个元素】;low 指向整体第一个元素, high 指向整体最后一个元素;

【下文中的high.data表示high所指的元素大小,high为其下标,亦可理解为指针,low同high】

【⊙-⊙】先用high.data值与key值比较,如果high.data >= key && high != low,high向前移一位,再用high.data值与key值比较,如果high.data < key && high != low,把high.data的值赋给low.data,low.data后移一位,然后用low.data值与key比较,如果low.data <= key && high != low,low后移一位,再用比较,如果low.data > key && high != low,用low.data 值赋给 high.data,重复【⊙-⊙】,直到low == high,将key值赋给low.data,然后把一当前low为分界线把整体一分为二,然后两个部分都重复【华丽分界线】以下的内容,直至每个后期独立出来的整体都只剩一个元素。


原始数列:{ 13  28  70  59  94  89  10  76  51  1 };


第一趟:{ 1  10 } 13 { 59  94  89  70  76  51  28 };


第二趟:1 { 10 } 13 { 28  51 } 59 { 70  76  89  94 };


第三趟:1  10  13  28 { 51 } 59  70 { 76  89  94 };


第四趟:1  10  13  28  51  59  70  76 { 89  94 };


第五趟:1  10  13  28  51  59  70  76  89 { 94 };


第六趟:1  10  13  28  51  59  70  76  89  94;


源代码如下【c++】

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#define MAXSIZE 100
using namespace std;

int Q = 1;
int n;

typedef struct {
	int data;
}Node;

typedef struct {
	Node *elem;
	int len;
}List;

void Set_Up(List &L) {
	L.elem = new Node[MAXSIZE];
	for(int i = 1; i <= L.len; i++)
		scanf("%d", &L.elem[i].data);
	return ;
}


void Quick_Sort(List &L, int s, int e) {
	int a = s, b = e;
	if(s >= e)
		return ;
	int key = L.elem[s].data;
	while(s < e) {
		while(s < e && L.elem[e].data >= key)
			e--;
		L.elem[s].data = L.elem[e].data;
		while(s < e && L.elem[s].data <= key) 
			s++;
		L.elem[e].data = L.elem[s].data;
	}
	L.elem[s].data = key;
	printf("第%d次交换结果:\n", Q++);
	for(int i = 1; i <= n; i++)
		printf("%d ", L.elem[i].data);
	printf("\n");
	Quick_Sort(L, a, s - 1);
	Quick_Sort(L, s + 1, b);
}

void Print(List L, int n) {
	for(int i = 1; i <= n; i++)
		printf("%d ", L.elem[i].data);
	printf("\n\n");
}

int main() {
	int t;
	while(1) {
		List L;
		printf("请输入数列的长度:");
		scanf("%d", &n);
		L.len = n;
		printf("请输入长度为%d的数列:", n); 
		Set_Up(L);
		Quick_Sort(L, 1, n);
		printf("排序后的数列如下:\n");
		Print(L, n);
	}
	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值