帮我写一个快排的算法
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;
以上是关于帮我写一个快排的算法的主要内容,如果未能解决你的问题,请参考以下文章
排序算法:堆排,快排的实现(快排的三种实现方法以及快排的优化)
排序算法:堆排,快排的实现(快排的三种实现方法以及快排的优化)