帮我写一个快排的算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了帮我写一个快排的算法相关的知识,希望对你有一定的参考价值。

帮忙啊

用什么语言?下面是Java的快排算法。public class QuickSort /** * 快速排序 */ public void quickSort(String[] strDate,int left,int right) String middle,tempDate; int i,j; i=left; j=right; middle=strDate[(i+j)/2]; do while(strDate[i].compareTo(middle)<0&& i<right) i++; //找出左边比中间值大的数 while(strDate[j].compareTo(middle)>0&& j>left) j--; //找出右边比中间值小的数 if(i<=j) //将左边大的数和右边小的数进行替换 tempDate=strDate[i]; strDate[i]=strDate[j]; strDate[j]=tempDate; i++; j--; while(i<=j); //当两者交错时停止 if(i<right) quickSort(strDate,i,right);//从 if(j>left) quickSort(strDate,left,j); /** * @param args */ public static void main(String[] args) String[] strVoid=new String[]"11","66","22","0","55","22","0","32"; QuickSort sort=new QuickSort(); sort.quickSort(strVoid,0,strVoid.length-1); for(int i=0;i<strVoid.length;i++) System.out.println(strVoid[i]+" "); 参考技术A 这是c++的实现 # include "stdio.h"
# include "time.h"
# include "stdlib.h"
# define N 10
int partition(int a[],int low,int high)//快速排序中的一趟
int pivotkey;//作为枢轴来使用
pivotkey=a[low];
while(low<high)
while(low<high&&a[high]>=pivotkey)
--high;
a[low]=a[high];
while(low<high&&a[low]<=pivotkey)
++low;
a[high]=a[low];

a[low]=pivotkey;
return low;

void qsort(int a[],int low,int high)//快速排序的递归形式
int pivotloc;
if(low<high)
pivotloc=partition(a,low,high);//一趟排序结果的调用
qsort(a,low,pivotloc-1);
qsort(a,pivotloc+1,high);


void init(int a[])//随机生成N个整数并
int i;
srand ( ( unsigned int ) time ( NULL ) );
for(i=0;i<N;i++)
a[i]=rand()%99+1;


void main()
int a[N],i;
init(a);
printf("排序前的数值内容\n");
for(i=1;i<=N;i++)//输出排序前的数组内容
printf("%d ",a[i-1]);
if(i%10==0)
printf("\n\n");

qsort(a,0,N);
printf("排序后的结果\n");
for(i=1;i<=N;i++)//输出排序后的数组内容
printf("%d ",a[i-1]);
if(i%10==0)
printf("\n\n");


printf("\n\n");
参考技术B procedure px(l,r:longint);
var i,j,tmp,mid:longint;
begin
i:=l;j:=r;mid:=a[(l+r) shr 1];
repeat
while a[i]<mid do inc(i);
while mid<a[j] do dec(j);
if i<=j then
begin
tmp:=a[i];
a[i]:=a[j];
a[j]:=tmp;
inc(i);dec(j);
end;
until i>j;
if l<j then px(l,j);
if i<r then px(i,r)'
end;

排序算法:堆排,快排的实现(快排的三种实现方法以及快排的优化)

目录


1. 堆排

升序建大堆,逆序建小堆,先建堆,堆建好之后,将堆中最后一个元素和第一元素互换,然后执行向下调整算法进行调堆,最终实现相应的顺序。

void AdjustDown(vector<int>& iv, int pos,int n)

	int parent = pos;
	int child = pos * 2 + 1;
	while (child < n)
	
		if (child + 1 < n && iv[child] < iv[child + 1])
			++child;
		if (iv[parent] < iv[child])
		
			swap(iv[parent], iv[child]);
			parent = child;
			child = parent * 2 + 1;
		
		else
			break;
	


void HeapSort(vector<int>& iv)

	for (int i = (iv.size()-1) >> 1 ; i >= 0; --i)
	
		AdjustDown(iv, i,iv.size());
	

	int end = iv.size() - 1;
	while (end >= 0)
	
		swap(iv[end], iv[0]);
		AdjustDown(iv, 0,end);
		--end;
	


int main()

	vector<int> iv =  2,5,6,7,8,9 ;
	HeapSort(iv);
	for (const auto& e : iv)
	
		cout << e << " ";
	
	cout << endl;
	return 0;

2. 快排

2.1 双指针法

void _QuickSort(vector<int>& iv, int left, int right)

	if (left >= right)
		return;
	int begin = left;
	int end = right;
	int key = left;

	while (begin < end)
	
		while (begin < end && iv[end] >= iv[key])
			--end;
		while (begin < end && iv[begin] <= iv[key])
			++begin;
		swap(iv[end], iv[begin]);
	

	swap(iv[key], iv[begin]);
	key = begin;

	_QuickSort(iv, left, key - 1);
	_QuickSort(iv, key + 1,right);


void QuickSort(vector<int>& iv)

	_QuickSort(iv, 0, iv.size()-1);

2.2 挖坑法

void _QuickSort(vector<int>& iv, int left, int right)

	if (left >= right)
		return;

	int begin = left;
	int hole = iv[left];
	int end = right;

	while (begin < end)
	
		while (begin < end && iv[end] >= hole)
			--end;
		iv[begin] = iv[end];
		while (begin < end && iv[begin] <= hole)
			++begin;
		iv[end] = iv[begin];
	

	iv[begin] = hole;
	int key = begin;

	_QuickSort(iv, left, key - 1);
	_QuickSort(iv, key + 1, right);


2.3 前后指针法

void _QuickSort(vector<int>& iv, int left, int right)

	if (left >= right)
		return;

	int next = left;
	int key = right;
	int prev = left - 1;

	while (next != key)
	
		if (iv[next] < iv[key] && ++prev != next)
		
			swap(iv[next], iv[prev]);
		
		++next;
	

	swap(iv[key], iv[++prev]);
	key = prev;

	_QuickSort(iv, left, key - 1);
	_QuickSort(iv, key + 1, right);

2.4 非递归

void _QuickSort(vector<int>& iv, int left, int right)

	stack<int> st;
	st.push(left);
	st.push(right);

	while (!st.empty())
	
		int r = st.top();
		st.pop();
		int l = st.top();
		st.pop();

		int end = r;
		int begin = l;
	

		int hole = iv[begin];
		while (begin < end)
		
			while (begin < end && iv[end] >= hole)
				--end;
			iv[begin] = iv[end];
			while (begin < end && iv[begin] <= hole)
				++begin;
			iv[end] = iv[begin];
		

		iv[begin] = hole;
		int key = begin;

		if (key - 1 > l)
		
			st.push(l);
			st.push(key - 1);
		

		if (key + 1 < r)
		
			st.push(key + 1);
			st.push(r);
		
	

2.5 快排的优化(三数取中+小区间优化)

三数取中

int getMidIndex(vector<int>& a,int left, int right)

    //首先求出mid的值
    int mid = (left + right) >> 1;
    //当left < mid时
    if(a[left] < a[mid])
    
        //当mid < right 时,返回mid的值(位于中间)
        if(a[mid] < a[right])
        
            return mid;
        
        else if(a[right] < a[left])
        
            return left;
        
        else
        
            return right;
        
    
    else //left >= mid
    
        if(a[mid] > a[right])
        
            return mid;
        
        else if(a[left] < a[right])
        
            return left;
        
        else
        
            return right;
        
    

小区间优化

//快排优化----最小区间优化
//当[left,right]的范围很小时,即数据量很小时,
//就直接使用插入排序,减少递归的次数(即相当于减少叶子节点的递归数目)
void InsertSort(vector<int>& iv)

	for (int i = 0; i < iv.size() - 1; ++i)
	
		int end = i;

		int tmp = iv[end + 1];
		while (end >= 0)
		
			if (iv[end] > tmp)
			
				iv[end + 1] = iv[end];
				--end;
			
			else
				break;
		

		iv[end + 1] = tmp;
	
    

以上是关于帮我写一个快排的算法的主要内容,如果未能解决你的问题,请参考以下文章

排序算法:堆排,快排的实现(快排的三种实现方法以及快排的优化)

排序算法:堆排,快排的实现(快排的三种实现方法以及快排的优化)

算法排序02——归并排序介绍及其在分治算法思想上与快排的区别(含归并代码)

算法基础——双指针:快速排序(重点)

快排的思考

快排的思考