人生难得是欢聚,唯有别离多

排序算法03------------快速排序

1.之前介绍的冒泡和选择排序都是适用于少量的数据,一旦数据量比较大,效率就很低的,因为他们的时间复杂度是O(n²)。

2.今天介绍一种算法不是很难,速度很快的排序算法,快速排序。

一 快速排序

  1)通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,

        整个排序过程可以递归执行。

  2)排序过程动图(来自百度百科)

    

 

 

  3)步骤:

    (1)设置两个变量 i,j,令i=0,j=n-1

      (2)  选择一个元素作为分割点(key),通常选第一个元素,令key=arrary[0]

      (3) 从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]的值交换

      (4) 从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]的值交换

      (5) 重复第3、4步,直到i==j。此时排序完成

二 代码

  

 1 #include<stdio.h>
 2 void quickSort(int *arr,int left,int right)
 3 {
 4     int i,j,temp;
 5     i=left;
 6     j=right;
 7     if(i==j)//递归结束条件 
 8         return;
 9     temp=arr[left];
10     while(j>i)
11     {
12         while(j>i&&arr[j]>=temp)
13             j--;
14         arr[i]=arr[j];
15         while(i<j&&arr[i]<=temp)
16             i++;
17         arr[j]=arr[i];
18     }
19     arr[j]=temp;
20     quickSort(arr,0,i);//递归执行,对左半分进行排序 
21     quickSort(arr,i+1,right);//递归执行,对右半分进行排序 
22 }
23 int main()
24 {
25     int i; 
26     int arr[10]={1,3,-9,0,10,2,8,9,19,-1};
27     quickSort(arr,0,9);//选择排序
28     for(i=0;i<10;i++)
29         printf("%d\n",arr[i]);
30     return 0;
31 } 

  快速排序是冒泡排序的一种改进,的时间复杂度是O(nlog₂n),是线性级。

posted @ 2020-03-23 14:04  对愁眠  阅读(304)  评论(0编辑  收藏  举报