快排中partition函数的优化

       最近在看算法,发现patition函数可以有个比较简单的写法 ,因此写下来以后用得到:

// arr[]为数组,start、end分别为数组第一个元素和最后一个元素的索引
// povitIndex为选取的枢纽下标,关于枢纽下标的选取,wessi的书上有很好的讲解。

//本函数返回index值,在这个下标左边的数都比Arr[index]小,在这个下标右边的数都比Arr[index]大
int partition( int Arr[], int start, int end, int pivotIndex )  //pivotIndex 是枢纽元
{
	int pivot = Arr[pivotIndex];
	swap( Arr[pivotIndex], Arr[end]);     //exchange the pivot and the last element

	int indexStore = start;
	for( int i = start; i < end; i++ )    
	{
		if( Arr[i] < pivot )
		{
			swap( Arr[indexStore], Arr[i] );
			indexStore ++;
		}
	}
	swap( Arr[indexStore], Arr[end] );
	return indexStore;
}

这个是快排程序,自己敲的,感觉挺简洁的。

/*****************************
@data:2015/7/1
@author:lss
@function:fast sort by using partition funtion
******************************/


#include <stdio.h>
#include <iostream>
using namespace std;

void swap( int &a, int &b ){   //交换函数
	int tmp  = a;
	a = b;
	b = tmp;

}
//本函数返回index值,在这个下标左边的数都比Arr[index]小,在这个下标右边的数都比Arr[index]大
int partition( int Arr[], int start, int end, int pivotIndex )  //pivotIndex 是枢纽元
{
	int pivot = Arr[pivotIndex];
	swap( Arr[pivotIndex], Arr[end]);     //exchange the pivot and the last element

	int indexStore = start;
	for( int i = start; i < end; i++ )    
	{
		if( Arr[i] < pivot )
		{
			swap( Arr[indexStore], Arr[i] );
			indexStore ++;
		}
	}
	swap( Arr[indexStore], Arr[end] );
	return indexStore;
}

void fastSort( int Arr[], int start, int end ){   //快排主程序
	if( start == end )
		return;

	int index = partition( Arr, start, end, start );   //得到index值,其实这个快排就是一个递归。
	if( index > start ) 
		fastSort(Arr, start, index-1 );  //left sort
	if( index < end )
		fastSort(Arr, index+1, end);   //right sort

}

int main(){
	int Arr[] = {3,2,4,7,4,56,1};
	fastSort( Arr, 0, 6);
	for(int i = 0 ; i <= 6; i++)
		cout<<Arr[i]<<endl;  
	return 0;
}

这个是另外一中写法,很多书上可能都是这么写的。

/******************************
*@data:2015/6/16
*@author:lss
*@function:
test sort_fast
**********************************/



#include <iostream>
#include <algorithm>

#include <stdio.h>
using namespace std;


void swap( int &x, int &y){  //swap funtion
	int tmp = x;
	x = y;
	y = tmp;
}

void fastSort( int Arr[], int start, int end ){  //fast funtion

	int pst = start;
	int ped = end-1;
	if( start == end && Arr == NULL)
		return;

	while( pst != ped ){
		if( Arr[pst] >Arr[end] ){
				swap( Arr[pst], Arr[ped]);
				ped --;
			}
		else
			pst ++;
	}
	swap( Arr[ped], Arr[end] );   //swap

	fastSort( Arr,  pst, ped-1 );   //left sort
	fastSort( Arr,  ped+1, end );   //left sort


}


int main(){   //main funtion
	int 
Arr[]={2,7,4,3,6};
	fastSort( Arr, 0, 4);
	for(int i = 0; i<4; i++)
		cout<<i<<endl;

	return 0;
}








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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值