赞
踩
注:3种快排的名字是我自己取的,并非专业名称
方法一(最常用的方法):左端抽轴(pivot)法
思路 && 操作:
视频讲解:请点击->动画
代码如下:
#include <stdio.h> #define N 15 int PartSort(int * a, int left, int right); void QuickSort(int * a, int left, int right); void Print(int * a); int main(void) { int i, a[N] = {5, 8, 1, 7, 4, 9, 48, 14, 0, 99, 45, 2, 84, 65, 6}; printf("Before sort:\n"); Print(a); printf("\nAfter sort:\n"); QuickSort(a, 0, N-1); Print(a); return 0; } int PartSort(int * a, int left, int right) { int pivot = a[left]; while (left != right) { while (left < right && a[right] >= pivot) right --; a[left] = a[right]; while (left < right && a[left] <= pivot) left ++; a[right] = a[left]; } a[left] = pivot; return left; } void QuickSort(int * a, int left, int right) { int mid = 0; if (left < right) { mid = PartSort(a, left, right); QuickSort(a, left, mid-1); QuickSort(a, mid+1, right); } return; } void Print(int * a) { int i; for (i = 0; i < N; i ++) printf("%d ", a[i]); printf("\n"); return; }
运行结果如下:
方法二:右端基准(basic)法
思路 && 操作:
视频讲解:请点击->动画
注:该视频所讲述略有瑕疵,视频中说L(left)与R(right)相遇后,L与R所指的同一个数(a)要与basic基准交换。实际上,交不交换取决于该数(a)与basic的大小,如果该数(a)大于basic基准,肯定要作交换,但是反之,就不能直接交换了,需要用该数(a)的下一个数与basic交换,想想为什么
举个例子:3 2 1 5(basic) —进行操作— 3 2 1 5(basic)
L R ----doing… — L&R
这个时候1 就不能和 5 换位置,换了就变成 3 2 5 1,1比5小怎么在5右侧?
实际上:每一次的basic的轴都是将一组数分割成两组的中心轴!
代码如下:
#include <stdio.h> #define N 15 void Swap(int * a, int left, int basic); int PartSort(int * a, int left, int right); void QuickSort(int * a, int left, int right); void Print(int * a); int main(void) { int a[N] = {5, 8, 1, 7, 4, 9, 48, 14, 0, 99, 45, 2, 84, 65, 6}; printf("Before sort:\n"); Print(a); QuickSort(a, 0, N-1); printf("\nAfter sort:\n"); Print(a); return 0; } void Swap(int * a, int left, int param) { int temp; temp = a[left]; a[left] = a[param]; a[param] = temp; return; } int PartSort(int * a, int left, int right) { int basic = right --; while (left < right) { while (left < right && a[left] <= a[basic]) left ++; while (left < right && a[right] >= a[basic]) right --; if (left != right) { Swap(a, left, right); left ++; right --; } } if (a[left] > a[basic]) Swap(a, left, basic); else Swap(a, ++ left, basic); return left; } void QuickSort(int * a, int left, int right) { int mid = 0; if (left < right) { mid = PartSort(a, left, right); QuickSort(a, left, mid-1); QuickSort(a, mid+1, right); } return; } void Print(int * a) { int i; for (i = 0; i < N; i ++) printf("%d ", a[i]); printf("\n"); return; }
运行结果如下:
方法三:快慢指针(i,j)法
思路 && 操作:
视频讲解:请点击->视频
代码如下:
#include <stdio.h> #define N 15 void QuickSort(int * a, int start, int end); int PartSort(int * a, int start, int end); void Swap(int * a, int i, int j); void Print(int * a); int main(void) { int a[N] = {5, 8, 1, 7, 4, 9, 48, 14, 0, 99, 45, 2, 84, 65, 6}; printf("Before sort:\n"); Print(a); QuickSort(a, 0, N-1); printf("\nAfter sort:\n"); Print(a); return 0; } void QuickSort(int * a, int start, int end) { int mid = 0; if (start < end) { mid = PartSort(a, start, end); QuickSort(a, start, mid-1); QuickSort(a, mid+1, end); } return; } int PartSort(int * a, int start, int end) { int i = start - 1; int j = start, pivot = end; for (; j < end; j ++) { if (a[j] < a[pivot]) { i ++; Swap(a, i, j); } } Swap(a, i + 1, pivot); pivot = i + 1; return pivot; } void Swap(int * a, int i, int j) { int temp; temp = a[i]; a[i] = a[j]; a[j] = temp; return; } void Print(int * a) { int i; for (i = 0; i < N; i ++) printf("%d ", a[i]); printf("\n"); return; }
运行结果如下:
以上就是与大家分享的全部内容啦,如果觉得对你有帮助,不妨点赞、收藏哦,当然如果有什么谬误,还请大家不吝赐教!谢谢观看!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。