龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

排序算法之快速排序

时间:2018-11-09 20:47来源:未知 作者:admin 点击:
分享到:
快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再

快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。

一趟快速排序的算法是:

1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;

2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];

3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;

4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;

5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)


C++示例代码

#include <iostream>

using namespace std;

void Qsort(int a[], int low, int high)

{

if(low >= high)

{

return;

}

int first = low;

int last = high;

int key = a[first];/*用字表的第一个记录作为枢轴*/

while(first < last)

{

while(first < last && a[last] >= key)

{

--last;

}


a[first] = a[last];/*将比第一个小的移到低端*/

while(first < last && a[first] <= key)

{

++first;

}


a[last] = a[first];/*将比第一个大的移到高端*/

}

a[first] = key;/*枢轴记录到位*/

Qsort(a, low, first-1);

Qsort(a, first+1, high);

}

int main()

{

int a[] = {.......};

Qsort(a, 0, sizeof(a) / sizeof(a[0]) - 1);/*这里原文第三个参数要减1否则内存越界*/

for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++)

{

cout << a[i] << "";

}

return 0;

}


JAVA示例代码

class Quick

{

public void sort(int arr[],int low,int high)

{

int l=low;

int h=high;

int povit=arr[low];


while(l<h)

{

while(l<h&&arr[h]>=povit)

h--;

if(l<h){

int temp=arr[h];

arr[h]=arr[l];

arr[l]=temp;

l++;

}


while(l<h&&arr[l]<=povit)

l++;

if(l<h){

int temp=arr[h];

arr[h]=arr[l];

arr[l]=temp;

h--;

}

}

print(arr);

System.out.print("l="+(l+1)+"h="+(h+1)+"povit="+povit+"\n");

if(l>low)sort(arr,low,l-1);

if(h<high)sort(arr,l+1,high);

}

}


C语言示例代码

void sort(int *a, int left, int right)

{

if(left >= right)/*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/

{

return ;

}

int i = left;

int j = right;

int key = a[left];

while(i < j) /*控制在当组内寻找一遍*/

{

while(i < j && key <= a[j])

{

j--;/*向前寻找*/

}

a[i] = a[j];

while(i < j && key >= a[i])

{

i++;

}

a[j] = a[i];

}

a[i] = key;/*当在当组内找完一遍以后就把中间数key回归*/

sort(a, left, i - 1);

sort(a, i + 1, right);

}


精彩图集

赞助商链接