有关快速排序的两个学习心得:
- 概述
快速排序是对冒泡排序的一种改进。基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
首先用数组的第一个数作为枢轴,然后将所有比它小的数都放到它的位置之前,所有比它大的数都放到它的位置之后,由此可以该“枢轴“记录最后所落的位置i作为分界线,将序列分割成两个子序列。这个过程称为一趟快速排序。
一趟快速排序的算法是:
设置两个变量i、j,排序开始的时候:令i=0,j=length-1;
以第一个数组元素作为枢轴,赋值给key,即key=array[0];
从j开始向前扫描,找到第一个小于key的值array[j],将array[j]和array[i]的值交换;
从i开始向后扫描,找到第一个大于key的值array[i],将array[i]和array[j]的值交换;
重复第3、4步,直到i==j,将枢轴元素移到正确位置上,即将key赋值给array[i]。
时间复杂度:通常,快速排序被认为是,在所有同数量级(O(nlogn))的排序方法中,其平均性能最好。但是,若初始记录序列按关键字有序或基本有序时,快速排序将蜕化为冒泡排序,其时间复杂度为O(n²)。
最坏:O(n²) 最好和平均:O(nlogn)
- 相关代码
#include<stdio.h>
void Quick_Sort(int *arr, int begin, int end){
if(begin > end)
return;
int tmp = arr[begin];
int i = begin;
int j = end;
while(i != j){
while(arr[j] >= tmp && j > i)
j--;
while(arr[i] <= tmp && j > i)
i++;
if(j > i){
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
arr[begin] = arr[i];
arr[i] = tmp;
Quick_Sort(arr, begin, i-1);
Quick_Sort(arr, i+1, end);
}
int main(){
int a[] ={5,9,8,15,41};
int i;
int n = 5;
Quick_Sort(a,0,4);
printf("\n");
printf("排序后");
while(i<5){
printf("%d ",a[i]);
i++;
}
}