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

#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;
}

执行结果:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值