算法档案
时间复杂度:O(n2)
最优时间复杂度:O(n * logn)
平均时间复杂度:O(n * logn)
空间复杂度:根据实现的方式不同而不同
稳定性:不稳定
算法步骤
- 第一步:在序列中选择一个元素作为“基准点” ,比如栗子中的7就是基准点
- 第二布:将所有小于“基准点”的元素都移到左边,所有大于“基准点”的元素都移到右边
- 第三步:对“基准点”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止、
- 呃,,,文字不懂没关系,上图!
。。。。。。。。
按照第一趟如图所示的方法递归左右两边的子序列
代码如下:
#include<stdio.h>
/*快速排序*/
void quick_sort(int array[],int left,int right);
void quick_sort(int array[],int left,int right)
{
int i = left ,j = right;
int temp;
int pivot;
pivot = array[(left + right) /2];
while (i <= j)
{
//从左到右找大于等于基准点的元素
while (array[i] < pivot)
{
i++;
}
//从右到左找小于等于基准点的元素
while (array[j] > pivot)
{
j--;
}
//如果i<=j,则互换元素
if (i <= j)
{
temp = array[i];
array[i] = array[j];
array[j] = temp;
i++;
j--;
} //第一趟走的内容, i > j时第一趟结束了
}
/*开始递归*/
if (left < j)//从左往右
{
quick_sort(array,left,j);//如果j小于0时,就可以归了 left = 0
}
if (i < right)
{
quick_sort(array,i,right);//如果i大于9时, 与也可以归了 right = 9
}
}
int main()
{
int array[] = {73,34,45,2,3,5,7,8,9,29,89,100,13,15};
int i,length;
length = sizeof(array)/sizeof(array[0]);
//printf("%d",length); 14
quick_sort(array, 0, length-1);
printf("排序后的结果是:\n");
for(i = 0 ; i < length; i++)
{
printf("%d ", array[i]);
}
putchar('\n');
}
运行结果:
明白了吗 是再总结下还
总结思路
通过一趟排序将待排序数据分割成独立的两部分,
其中一部分的所有元素均比另一部分的元素小,
然后分别对这两部分继续进行排序,
重复上述步骤直到排序完成。