快速排序
1.前言
快排基于的是冒泡排序改进的一种算法。冒泡排序的时间复杂度为O(n2),而快排的时间复杂度为O(nlgn),有了极大的改进。
2. 原理
将原来的一整个序列切割成两半,找到一个中间值,不断在左边的序列里寻找比标记值更大的元素,在右边的序列中寻找比标记元素更小的元素。即将大的元素向后移,小的元素向前移。
3.代码&&比较
3.1 冒泡排序
for (int i = 1; i <= n - 1; i++)//进行n-1次比较
{
int j = 1;
while(j<=n-i)
{
int t;
if(a[j]>a[j+1])//前面元素比后面元素值大就进行互换
{
a[j + 1] = t;
a[j + 1] = a[j];
a[j] = t;
}
}
}
3.2快速排序
int quick_sort(int *number,int low,int high)
{
number[0] = number[low];
int key = number[low];
while(low<high)
{
while (low < high&&number[high] >= key)
high--;
number[low] = number[high];//将大值,从高处向地处搬移
while (low < high&&number[low]<= key)
low++;
number[high] = number[low];//将小值,从低处向高处搬移
}
number[low] = number[0];
}
void work(int *number,int low,int high)
{
if(low<high)
{
int mid = quick_sort(number, low, high);//找到标记值的位置
//进行完一次快速排序后,标记值位置左边为小于它的全部元素
//右边位置为大于它的全部元素
work(number, low, mid - 1);//对左边位置进行快排
work(number, mid + 1, high);//对右边位置进行快排
}
}
3.快排时间复杂度分析
第一次进行一次操作,序列分为两个队列,第二次进行两次操作,序列分为四个队列,所以总共是lgn次操作,由于每一次操作,我们都是相当于,对序列中所有元素的值进行比较,一共是n次,所以总共就是nlgn次操作。