第一种是我自己自创的写法,因为之前完全没有学过快排,所以我自己试着从无到有实现了一下,最开始的代码是思维简单,代码量繁多,后来经过我的重重优化化繁为简后,不负众望的弄出了一种新的写法(网上好像还真没人像我这么写过),新写法的优点只有一个那就是代码量少,最重要的是相比于传统写法,我只用了一个while循环+递归就实现了所有操作,而传统写法使用了3个while循环+递归,当然了因为思想是一样的所以时间复杂度什么的并没有区别,但是我使用了flag信号灯原理解决了代码冗余的问题,灵活运用flag=+-1能够有效解决“大小于号的转换”、“+-1互换”、“自身变换的问题”,如果能看懂那么你一定会有所收获。我的写法只是有助于提高思维的灵活性,但如果是考试的话千万不要像我那么写,因为很费脑子,而且批卷老师有可能从来没见过这种写法从而不给你细看认为你在乱写而直接给你判错,当然了你要是能找到他可以去跟他理论,前提是你找得到。经过我的测试我的写法没有任何的问题,不放心的话你可以自己创建数组进行测试,如果发现问题还请告知我,我将感激不尽。
我的写法:
如果放在一个函数中,和传统写法代码量差不多,但是我用了flag信号灯所以理解起来不是那么容易,提示flag的值在+-1之间来回转换+1是倒序-1是正序,当然这个是可以换一下的,我就不费这个力气了
int interchange(int* left,int* right) {
int temp = *left;
*left = *right;
*right = temp;
return 1;
}
int Part_sort(int arr[], int left ,int right) {
int pivot, flag;
pivot = arr[left];
flag = 1;
while (left != right) {
if (flag * (arr[right] -pivot) >=0 ) right -= flag;
else {
interchange(&arr[left], &arr[right]);
left+=flag;
flag = -flag;
interchange(&left, &right);
}
}
return left;
}
int QuickSort(int arr[],int begin ,int end) {
if (begin<end) {
int mid=Part_sort(arr, begin, end);
QuickSort(arr, begin, mid - 1);
QuickSort(arr, mid + 1, end);
}
return 1;
}
传统写法:
传统写法不但好记忆而且代码量也不是特别多,就是里面的两个while循环有一点代码冗余的问题,总体来说确实比我写的实用性要高很多。
int quick_sort(int s[], int l, int r)
{
if (l < r)
{
//Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1
int i = l, j = r, x = s[l];
while (i < j)
{
while (i < j && s[j] >= x) // 从右向左找第一个小于x的数
j--;
if (i < j)
s[i++] = s[j];
while (i < j && s[i] < x) // 从左向右找第一个大于等于x的数
i++;
if (i < j)
s[j--] = s[i];
}
s[i] = x;
quick_sort(s, l, i - 1); // 递归调用
quick_sort(s, i + 1, r);
}
return 1;
}
学习记录,复习自用,不喜勿喷,若有错误或建议欢迎指正,感激不尽!