int a[101], n; // 快速排序函数 voidquicksort(int left, int right){ // 如果左边索引小于右边索引,说明还可以继续划分 if (left < right) { // 定义左右指针和基准值 int i = left, j = right, pivot = a[left]; // 开始划分 while (i < j) { // 注意方向为:从右往左找第一个小于基准值的元素 while (i < j && a[j] >= pivot) { j--; } if (i < j) { // 将小于基准值的元素放到左边 a[i++] = a[j]; } // 从左往右找第一个大于基准值的元素 while (i < j && a[i] <= pivot) { i++; } if (i < j) { // 将大于基准值的元素放到右边 a[j--] = a[i]; } } // 将基准值放到正确的位置 a[i] = pivot; // 对基准值左右两侧的子数组进行递归排序 quicksort(left, i - 1); quicksort(i + 1, right); } } intmain(){ // 输入数组大小 cin >> n; // 输入数组元素 for (int i = 0; i < n; i++) { cin >> a[i]; } // 调用快速排序函数 quicksort(0, n - 1); // 输出排序后的数组 for (int i = 0; i < n; i++) { cout << a[i] << " "; }
system("pause"); return0; }
四、总结
算法的核心思想是我们需要牢记的,但除此之外的一些细节对算法的正确实现却相当重要例如:
数组是否越界,数组下标是否从0开始检查
1 2 3 4 5
int n= 10; for(int i = 0; i < 10; i++){} //刚好循环10次 for(int i = 1; i < 10; i++){} //循环9次 for(int i = 0; i <= 10; i++){} //循环11次 for(int i = 1; i<=10; i++){} //循环10次
运行完成后是否及时释放栈空间
1 2
int* array = new int[size]; delete[] array;
涉及递归的函数
1 2 3 4 5
void quicksort(int left, int right) { ... quicksort(left, i - 1); quicksort(i + 1, right); }