文章目录
(升序)快速排序的思想:
描述:
快速排序具体可以分为两块部分:踢与分。
- 踢:将线性队列中的某个元素a(一般是开头的元素),由两端往中间比较,为它选择合适的位置,达成队列中a元素的左侧的元素的值小于a元素值,右侧的元的素值大于a元素值。由此,确定了a元素在升序线性表中的位置就确定了下来。
- 分:线性表中a元素的位置确定,接下来对a元素左侧和右侧的子线性表进行排序,用上述的方法对子线性表排序。
时间复杂度:O(NLogN)
分析:以树的概念,树的深度为LogN,同深度的线性表处理时N,LogN*N=O(NLogN)
代码:
#ifndef QUICKSORT_H_INCLUDED
#define QUICKSORT_H_INCLUDED
/* 升序:为长度为n的数组s快排,0起始 */
void QuickSort(int s[], int n)
{
if(n<=1)
return ;
int i=0, j=n-1;
while(i<j){
int key=s[i];
while(i<j && key<=s[j]){
j--;
}
s[i] = s[j];
while(i<j && s[i]<=key){
i++;
}
s[j] = s[i];
}
return ;
}
#endif // QUICKSORT_H_INCLUDED
代码测试
代码检测路径:
https://pintia.cn/problem-sets/15/problems/720
测试代码:
#include<stdio.h>
void QuickSort(int dt[], int s, int n)
{
if(s+1>=n)
return ;
int i=s, j=n-1;
int key=dt[i];
while(i<j){
while(i<j && key<=dt[j]){
j--;
}
dt[i] = dt[j];
while(i<j && dt[i]<=key){
i++;
}
dt[j] = dt[i];
}
dt[i] = key;
QuickSort(dt, s, i);
QuickSort(dt, i+1, n);
return ;
}
int main(void)
{
int n;
int num[100000];
scanf("%d", &n);
for(int i=0; i<n; i++){
scanf("%d", &num[i]);
}
QuickSort(num, 0, n);
for(int i=0; i<n; i++){
printf("%d", num[i]);
if(i+1<n){
printf(" ");
}
else{
printf("\n");
}
}
return 0;
}