C/C++ 数组排序(平均时间复杂度 O(nlogn))归并、快速、堆、希尔之快速排序
2018-03-05 11:45
483 查看
快速排序:
给定一个int数组A以及大小n,请返回排序后的数组;核心思想:
1、选取一个轴值(一般是第一个数),将整个数组小于等于轴值的元素放到轴值左边,大于的放到右边。1.1、设置一左(i)一右(j)两个指针。
1.2、先从右指针j往左边走,遇到小于轴值(第一个数),将它赋值给左边指针i,并且左边指针i向右移动一个,右指针j停止移动。
1.3、该左边指针i往右边走,遇到大于轴值的,将它赋值给停止移动的右指针j,并且右边指针j向左移动一个,左指针i停止移动。
1.4、循环1.2、1.3步,直到指针i和指针j碰头。
1.5、再将轴值存到A[i]里面,这样就将整个数组小于等于轴值的元素放到轴值左边,大于的放到右边。
2、以轴值为中心将数组分为两半,递归的调用步骤1,直到所有元素都有序。
代码
class QuickSort { public: int* quickSort(int* A, int n) { quickProcess(A,0,n-1); return A; } void quickProcess(int *A, int start, int end){ if(start >= end) //== 为什么不可以,可以思考一下 return; int value = A[start]; //轴值 int i= start; int j = end; //找到放轴值的合适位置,并且将小的放左边大的放右边 while(i<j){ while(i<j && value<=A[j]){ j --; } if(i<j){ A[i++] = A[j]; } while(i<j && value>A[i]){ i++; } if( i<j){ A[j--] = A[i]; } } //将轴值放到最终位置 A[i] = value; //左右分开递归调用 quickProcess(A, start, i-1); quickProcess(A, i+1, end); } };main调用:#include <iostream>
using namespace std;
int main(){ int AAA[]={1,3,6,9,2,5,4,8,7}; QuickSort Q; int *b=Q.quickSort(AAA,9); for(int i=0;i<9;i++){ cout<<b[i]<<endl; } return 0; }
相关文章推荐
- C/C++ 数组排序(平均时间复杂度 O(nlogn))归并、快速、堆、希尔之希尔排序
- C/C++ 数组,链表排序(平均时间复杂度 O(nlogn))归并、快速、堆、希尔之归并排序
- C/C++ 数组排序(平均时间复杂度 O(nlogn))归并、快速、堆、希尔之堆排序
- C++实现几种常用的时间复杂度为O(nlogn)的排序方法:归并排序、快速排序、堆排序、希尔排序
- 快速排序[平均时间复杂度O(NlogN)]
- 快速排序的时间复杂度nlogn是如何推导的??
- Java-时间复杂度为O(nlogn)的排序算法(快速排序, 归并排序, 堆排序, 希尔排序)
- 数据结构(C#)--冒泡、插入、快速、堆、归并、希尔、选择各种排序排序过程比较以及各种排序的所用时间的对比
- 快速排序的时间复杂度nlogn是如何推导的??
- 数组排序(插入、选择、希尔、堆、归并、快速、冒泡)
- 快速排序的时间复杂度nlogn是如何推导的??
- c语言排序算法总结 选择 插入 冒泡 希尔 快速 堆排序 稳定性 时间复杂度 空间复杂度
- C++实现各种基础排序(冒泡、选择、快排、插入、堆排、希尔、归并)
- java 快速排序 时间复杂度 空间复杂度 稳定性
- c# 自定义排序类(冒泡、选择、插入、希尔、快速、归并、堆排序等)
- 8大排序之----快速排序与时间复杂度
- java 快速排序 时间复杂度 空间复杂度 稳定性
- C/C++面试题(三) 推断二叉树、快速排序递归实现、递归判断数组递增
- c++ 数组 有序数组插入 归并排序思想
- MIT算法导论-插入排序与归并排序及时间复杂度计算