排序算法之快速排序

快速排序是原地排序,其最坏运行时间为O(n^2),但是其期望运行时间为O(nlgn)。

快速排序是一种递归调用,其原理为:在排序的数组中选择一个关键字key=A[i],然后将数组划分为两组A[1,2...p-1],A[p+1,......q],其中A[p]=key。之后再对A[1,2...p-1],A[p+1,......q]递归调用。

实现过程1(升序)

 下面实现是1从右向左找小于关键字的数的位置,找到之后把它放到关键字的位置,2之后从左向右找大于关键字的数,找到之后放到1中大于关键字的那个位置3如果没遍历完数组,重复1、2

QuickSort(A,p,r)

    if p<r

        key←A[p]

        low←p

        right←r

         while low<high

                   while low<high and key<A[high]   //从右向左找小于关键字key的数

                               do   high←high-1

                   v[low]←v[high]

                   while low<high and key>=v[low]  //从左往右找大于关键字key的数

                                  low←low+1

                  v[high]←v[low]

         v[low]=key//关键字key的最终位置

       QuickSort(A,p,low-1)//递归调用

       QuickSort(A,low+1,r)

 

#include<iostream>
#include <vector>
using namespace std;
int main()
{
	void quitsort(vector<int> &v,int low,int high);
	vector<int> test;
	for (int i=0;i<10;i++)
	{
		int k;
		cin>>k;
		test.push_back(k);
	}
	quitsort(test,0,9);
	for(vector<int>::iterator it=test.begin();it!=test.end();it++)
	{
		cout<<*it<<' ';
	}
	return 0;
}
void quitsort(vector<int> &v,int low,int high)
{
	if(low<high)
	{
		int key=v[low];
		int left=low,right=high;
		while (low<high)
		{
			while(low<high&&key<v[high])//从右往左找小于关键字key的数
			{
				high--;
			}
			v[low]=v[high];
			while (low<high&&key>=v[low])//从左往右找大于关键字key的数
			{
				low++;
			}
			v[high]=v[low];
		}
		v[low]=key;
		quitsort(v,left,low-1);//递归调用
		quitsort(v,low+1,right);
	}
	
}


另一种实现是:

QuickSort(A,p,r)

     if p<r

      then q←Partition(A,p,r)

      QuickSort(A,p,q-1)

      QuickSort(A,q+1,r)

其中Partition(A,p,r)是对数组原地重排

Partition(A,p,r)

     key←A[r]

     i←p-1

     for j← p to r-1

          do if A[j]<=key

                then i←i+1

                          exchange  A[i]↔A[j]

    exchange  A[i+1]↔A[r]

return i+1

其中i用来分界,A[i]<key,A[i+1}>=key,即i左边的数都小于key。j用来遍历

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值