快速排序经常在考,需要掌握,基本原理:
一趟就是左右哨兵碰头了,即交换一次基准数。
Java实现:
package com.hwb.app;
public class QuickSort {
static void Print(int a[]){
for(int i=0; i<a.length; i++)
{
System.out.print(a[i] + (i<a.length-1 ? ", " : ""));
}
System.out.println();
}
static void Sort(int a[], int p, int q){
if(p>q)//很重要,越界判断
return;
int key = a[p];
int i = p;
int j = q;
while( i!=j )
{//下面的是从大到小排序,如果从小到大,则需右边找比key小的、左边找比key大的,最后交换(当然)
//哨兵j找到比key大的停止
while( a[j]<=key && i<j )
j--;
//哨兵i找到比key小的停止
while( a[i]>=key && i<j )
i++;
if (i<j) {//两个数交换
//方式一
int tt = a[i];
a[i] = a[j];
a[j] = tt;
//方式二
//a[i] = a[i] + a[j];
//a[j] = a[i] - a[j];
//a[i] = a[i] - a[j];
}
}
if(i==j)//将哨兵交换
{
a[p] = a[i];
a[i] = key;
}
//再排序新基准i的左边、右边
Sort(a,p,i-1);
Sort(a,i+1,q);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int aa[] = {9, 2, 4, 1, 3, 8, 5};
Print(aa);
Sort(aa, 0, aa.length-1);
Print(aa);
}
}
C++实现:
#pragma once
#include <iostream>
using namespace std;
void Print(int* a, int n) {
for (int i = 0; i < n; i++)
{
cout << a[i] << ((i < n-1) ? ", " : "");
}
cout<<endl;
}
//快速排序
void quick_sort(int s[], int l, int r)
{
if (l < r)
{
//Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1
int i = l, j = r, x = s[l];
while (i < j)
{
while (i < j && s[j] >= x) // 从右向左找第一个小于x的数
j--;
if (i < j)
s[i++] = s[j];
while (i < j && s[i] < x) // 从左向右找第一个大于等于x的数
i++;
if (i < j)
s[j--] = s[i];
}
s[i] = x;
quick_sort(s, l, i - 1); // 递归调用
quick_sort(s, i + 1, r);
}
}
int main_QuickSort()
{
int aa[] = { 9, 2, 4, 1, 3, 8, 5 };
int n = sizeof(aa) / sizeof(aa[0]);
Print(aa, n);
quick_sort( aa, 0, n-1 );//从大到小排列
Print(aa, n);
return 0;
}
参考:
http://developer.51cto.com/art/201403/430986.htm
http://blog.csdn.net/morewindows/article/details/6684558
http://blog.csdn.net/lemon_tree12138/article/details/50622744