在冒泡排序中,一次扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只减少1。
快速排序是对冒泡排序的一种本质改进。
基本思想:分治法,通过一趟扫描后,使得排序序列的长度能大幅度地减少。快速排序通过一趟扫描,就能确保某个数(以它为基准点吧)的左边各数都比它小,右边各数都比它大。然后又用同样的方法处理它左右两边的数,直到基准点的左右只有一个元素为止。
快速排序:不稳定,时间复杂度 最理想 O(nlogn) 最差时间O(n^2)
#include<iostream>
#include<cstring>
using namespace std;
int const ic_limit = 100002;
void vInputData(int &iNum,int iArr[]);
void vQuickSort(int iArr[],int iLeft,int iRight);
void vPrintAns(int iNum,int iArr[]);
int main()
{
int iNum;
int iArr[ic_limit];
memset(iArr,0,sizeof(iArr));
vInputData(iNum,iArr);
vQuickSort(iArr,1,iNum);
vPrintAns(iNum,iArr);
return 0;
}
void vInputData(int &iNum,int iArr[])
{
cin >> iNum;
for(int i=1; i<=iNum; i++)
{
cin >> iArr[i];
}
}
void vQuickSort(int iArr[],int iLeft,int iRight)
{
int iKeyValue;
int iLow;
int iHigh;
//以iKeyValue为基准
iKeyValue = iArr[iLeft];
iLow = iLeft;
iHigh = iRight;
while(iLow < iHigh)
{
while((iLow < iHigh) && (iArr[iHigh] >= iKeyValue))
{
iHigh --;
}
if(iLow < iHigh)
{
iArr[iLow] = iArr[iHigh];
iLow ++;
}
while((iLow < iHigh) && (iArr[iLow] <= iKeyValue))
{
iLow ++;
}
if(iLow < iHigh)
{
iArr[iHigh] = iArr[iLow];
iHigh --;
}
}
iArr[iLow] = iKeyValue;
if(iLeft < (iLow-1))
{
//对左区间递归排序
vQuickSort(iArr,iLeft,iLow-1);
}
if((iLow+1) < iRight)
{
//对右区间递归排序
vQuickSort(iArr,iLow+1,iRight);
}
}
void vPrintAns(int iNum,int iArr[])
{
for(int i=1; i<iNum; i++)
{
cout << iArr[i] << " ";
}
cout << iArr[iNum] << endl;
}
分享到:
相关推荐
### 快速排序知识点解析 #### 一、快速排序简介 快速排序是一种高效的排序算法,由英国计算机科学家托尼·霍尔(Tony Hoare)在1960年提出。它采用分治策略来把一个序列分为较小和较大的两个子序列,然后递归地...
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出,它的基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,然后分别对这两部分记录...
快速排序快速排序 快速排序 快速排序 快速排序 快速排序
快速排序是一种高效的排序算法,在计算机科学和数学中被广泛研究。其基本原理是分治法策略,即将一组数据分为两个子序列并分别进行排序。快速排序期望的时间复杂度为O(nlogn),但在最坏的情况下,它的时间复杂度可...
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法(Divide and Conquer),即把一个大问题分解成若干个小问题来解决,最终将小问题的结果合并得到原问题的解。在这...
本主题将深入探讨四种常见的排序算法:堆排序、快速排序以及两种未在标题中明确提到但同样重要的排序方法——基数排序和计数排序。 首先,让我们详细了解一下堆排序。堆排序是一种基于比较的排序算法,利用了数据...