首页 > 编程知识 正文

快速排序法,快速排序例题

时间:2023-05-04 12:41:08 阅读:118048 作者:732

快速排序1 .算法思想快速排序的基本思想:在一次排序中将待排序记录分为两个独立的部分,如果其中一个记录的关键字小于其他部分的关键字,则继续分别对这两个记录进行排序,顺序

2 .实现原理2.1,设置low、high两个变量,排序开始时: low=0,high=size-1。2.2、整个数组找基准正确位置,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面

默认数组的第一个数字是基准数据,其值为key=array[low]。 如果从后向前(high)找到第一个小于key的array[high],则array[high]基于array[low],即array [ llay ] 退出时array[high] key ) (此时,从前向后搜索(low ),如果找到大于key的第一个array[low],则将array[low]称为array[high],即array[low] 结束时循环2-3步,直到array[low] key (变为low=high,该位置为基准位置。 将基准数据分配到当前位置。 2.3、第一次找到的基准位置为下一次边界点。

2.4、排序递归调用(recursive )分界点前和分界点后的部分排列,重复2.2、2.3、2.4的步骤。

2.5、最终得到排序的数组。

3 .动态演示

4 .整个代码的三个函数

基准函数: intgetStandard(intarray[],int low,int high () ) ) ) ) ) ) ) ) ) )。

(返回基准位置的下标)

递归排序函数: voidquicksort(intarray[],int low,int high ) ) ) ) ) ) ) ) )。

主函数: int main ()。

# include stdio.h # include stdlib.hvoiddisplay (int * array,int size ) { for } inti=0; i size; I ) {printf('%d ',array[i] ); }printf((n ); }intgetStandard(intarray (,int i,int j ) )//基准数据intkey=array ); while(Ij )//默认标准为从左开始,因此从右开始比较) /如果团队末尾的元素大于或等于基准数据,则j指针while ) Ijarray[j]=key ) j--; 如果发现小于array[i],则将后续值array[j]设置为其if[Ij]{array[I]=array[j]; (//如果团队的起始元素小于或等于基准数据,则I指针while(Ijarray[I]=key ) I; 如果发现大于array[j]的,则将上一个值array[i]设置为其if[Ij]{array[j]=array[I]; (//退出循环时I和j相等,此时I或j为key的正确索引位置) /向正确位置array[i]=key分配基准数据的返回I; }voidquicksort(intarray (,int low,int high ) ) /起始默认标准为low if (low high ) ) /段位置下标intstandard=getstandard ) array //右排序快速排序(阵列,标准1,高); }//快速排序//voidquicksort(intarray )、int low、int high )//if )/intI=low; //int j=high; //int key=array[i]; //

while (i < j) {// while (i < j && array[j] >= key) {// j--;// }// if (i < j) {// array[i] = array[j];// }// while (i < j && array[i] <= key) {// i++;// }// if (i < j) {// array[j] = array[i];// }// }// array[i] = key;// QuickSort(array, low, i - 1);// QuickSort(array, i + 1, high);// }// }int main() { int array[] = {49, 38, 65, 97, 76, 13, 27, 49, 10}; int size = sizeof(array) / sizeof(int); // 打印数据 printf("%d n", size); QuickSort(array, 0, size - 1); display(array, size); // int size = 20; // int array[20] = {0}; // 数组初始化 // for (int i = 0; i < 10; i++) { // 数组个数 // for (int j = 0; j < size; j++) { // 数组大小 // array[j] = rand() % 1000; // 随机生成数大小 0~999 // } // printf("原来的数组:"); // display(array, size); // QuickSort(array, 0, size - 1); // printf("排序后数组:"); // display(array, size); // printf("n"); // } return 0;} 5. 结果展示

(递归调用,不好展示每次排序结果)

6. 算法分析

时间复杂度:

最好: O ( n l o g 2 n ) O(n log_{2} n) O(nlog2​n)最坏: O ( n 2 ) O(n^2) O(n2)平均: O ( n l o g 2 n ) O(n log_{2} n) O(nlog2​n)

空间复杂度: O ( n l o g 2 n ) O(n log_{2} n) O(nlog2​n)

稳定性:不稳定

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。