#include<iostream>
using namespace std;
void swap(int &v1, int &v2){
int temp = v1;
v1 = v2;
v2 = temp;
}
void quick_sort(int arr[], int len){
if(len > 1){
int left = 1, right = len-1;
do{
while(left < len && arr[left] <= arr[0])
left++;
while(right > 0 && arr[right] >= arr[0])
right--;
if(right < left)//规避case:5 1 11 5 5
break;
if(arr[left] > arr[0] && arr[right] < arr[0]
&& right > 0 && left < len){
swap(arr[left], arr[right]);
right--;
left++;
}
}while(left < right);
swap(arr[0], arr[left-1]);
quick_sort(&arr[0], left-1);
quick_sort(&arr[left], len - left);
}
}
void prtArr(int arr[], int len){
for(int i=0;i < len;i++)
cout<<arr[i]<<" ";
cout<<endl;
}
int main(){
unsigned int ARRLEN = 0;
int arr[] = {1, 12, 5, 5, 5, 1, 12, 5, 5, 5, 1,
12, 5, 1, 12, 5, 5, 5, 1, 12, 5, 5, 5, 5, 5,
1, 12, 5, 5, 5, 1, 12, 5, 5, 5, 1, 12, 5, 5, 5};
ARRLEN = sizeof(arr) / sizeof(unsigned int);
quick_sort(arr, ARRLEN);
prtArr(arr, ARRLEN);
return 0;
}
二分法:
#include<iostream>
#include<cstdlib>
using namespace std;
int binary_search(int arr[], int len, int val){
int low = 0, high = len-1, mid = 0;
while(low <= high){
mid = (low + high) / 2;
if(val == arr[mid])
return mid;
if(val < arr[mid])
high = mid-1;
else
low = mid + 1;
}
return -1;//查找失败
}
void prtArr(int arr[], int len){
for(int i=0;i < len;i++)
cout<<arr[i]<<" ";
cout<<endl;
}
int comparator(const void* p1, const void* p2){
int v1 = *((int*)p1);
int v2 = *((int*)p2);
return ((v2 > v1) ? -1 : (v2 < v1) ? 1 : 0);
}
int main(){
unsigned int ARRLEN = 0;
int val = 12;
int arr[] = {1, 12, 3};
ARRLEN = sizeof(arr) / sizeof(unsigned int);
qsort(arr, ARRLEN, sizeof(int), comparator);
prtArr(arr, ARRLEN);
cout<<binary_search(arr, ARRLEN, val)<<endl;
return 0;
}
快速排序的另一种C++写法,个人觉得更优化,更易书写:
#include <iostream>
using namespace std;
#define ARRLEN(arr, type) (sizeof(arr) / sizeof(type))
void quick_sort(int *p, int low, int high){
if(low < high){
int val = p[low];//index为low出的空间多了出来
int left = low, right = high;
while(left < right){
while(left < right && p[right] >= val)
--right;
p[left] = p[right];
while(left < right && p[left] <= val)
++left;
p[right] = p[left];
}
p[left] = val;
quick_sort(p, low, left-1);
quick_sort(p, left+1, high);
}
}
void prtArr(const int *p, int len){
for(int i=0;i < len;i++)
cout<<*p++<<((i == len-1) ? "" : " ");
cout<<endl;
}
int main(){
int arr[] = {1, 12, 5, 5, 5, 1, 12, 5, 5, 5, 1,
12, 5, 1, 12, 5, 5, 5, 1, 12, 5, 5, 5, 5, 5,
1, 12, 5, 5, 5, 1, 12, 5, 5, 5, 1, 12, 5, 5, 5};
cout<<ARRLEN(arr, int)<<endl;
prtArr(arr, ARRLEN(arr, int));
quick_sort(arr, 0, ARRLEN(arr, int) - 1);
prtArr(arr, ARRLEN(arr, int));
return 0;
}
执行结果: