立此存照(12)[C++]快速排序与二分法查找及C++库函数排序

来源:互联网 发布:网络推广日常工作 编辑:程序博客网 时间:2024/06/07 09:30
#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 5break;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;elselow = 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;#defineARRLEN(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;}

执行结果:



0 0
原创粉丝点击