引言
此文继上一次的c++快速排序之后,是时隔一年后的重新领悟。快速排序就是从一列序列中选择一个数作为基数,一般以左边第一个元素为基数,然后定义两个变量left与right,left指向左边第一个元素,与基数指向相同,right指向右边倒数第一个元素,从右侧开始移动right找到比基数小的元素,然后从左侧开始找到比基数大的元素,将右侧比基数小的元素与左侧比基数大的元素,即left与right指向的元素交换位置,再继续从右边开始移动right找出比基数小的元素,移动左边的left找到比基数大的元素,交换right与left指向的元素的位置,继续执行该操作,直到lfet指向的元素与right指向的元素是同一个元素,此时交换left指向的元素与基数的值,达到了左边的元素比基数小,右边的元素比基数大,再将基数左边所有的元素看成一个序列,基数右边所有的元素看成一个序列,两个序列按照之前的方式,选取左起第一个元素为基数,同时left指向左起第一个元素,right指向序列最后一个元素,继续之前的操作。基数选择左起第一个元素时,要先从右边开始移动下标查找,基数选择右边的元素,需要从左边开始移动查找。与按照从小到大的顺序排列和从大到小的顺序排列没有关系。
示例
下面是实现快速排序的代码,采用vs2010开发的控制台输出程序:
// quickSort.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <stdlib.h>
#include <iostream>using namespace std;/************************************************************************/
/* 功能:快速排序 (从小到大)3,5,2,7,9,1,6功能函数:void quickSort(int *parr,int left,int right) 快速排序void printArr(int *parr,int n) 输出数组元素*/
/************************************************************************/void quickSort(int *parr,int left,int right)
{int base,temp;int i = left;int j = right;base = parr[left];if(left >= right)//一个数或者不满足left<right则跳出循环{return;}while (i < j)//左边下表小于右边{while (parr[j] >= base && i < j)//右侧开始,寻找比基数小的元素,未找到下标减减{--j;}while(parr[i] <= base && i < j)//左侧开始找比计数大的元素,未找到下标加加{++i;}if (i < j)//坐标的下标小于右边的下标,且找到左边比基数大的元素,右边比基数小的元素,交换位置{temp = parr[j];parr[j] = parr[i];parr[i] = temp;}}parr[left] = parr[i];//左边的下标等于右边的下标,交换该元素,与基数的位置parr[i] = base;quickSort(parr,left,i-1);//左边序列排序quickSort(parr,i+1,right);//右边序列排序
}void printArr(int *parr,int n)
{for(int i = 0; i < n; ++i){cout<<parr[i]<<"\t";}
}int _tmain(int argc, _TCHAR* argv[])
{int arr[] = {3,5,2,7,9,1,6};printArr(arr,7);cout<<endl;quickSort(arr,0,6);printArr(arr,7);cout<<endl;system("pause");return 0;
}
项目的结构:
运行效果
重在理解,仅供参考。