c++实现排序

排序

  • 冒泡排序
  • 插入排序
  • 希尔排序
  • 选择排序
  • 归并排序·
  • 快速排序
  • 堆排序
  • 二叉排序树

冒泡排序

template<typename T>
void bulbleSort(T &arr,int nSize) {

	
	int i, j;
	for (i = 0; i < nSize; ++i) {
		for (j = 0; j < nSize - i - 1; ++j) {
			if (arr[j + 1] < arr[j]) {
				swap(arr[j+1], arr[j]);
			
			}
			
		}

}

插入排序

/*
1.从第一个元素开始 该元素可以为已经被排序
2.取出下一个元素,在已经排序后的元素中从后向前扫描
3.如果该元素(已排序)大于新元素,将该元素移动到下一位置
4.重复步骤3,直到找到已经排序的元素小于或者等于新元素的位置
5.将新元素插入到该位置
6.重复2-5步骤
*/
template <typename T>
void InsertSort(T *arr,size_t size) {

	int i, j;
	T temp;
	for (i = 1; i < size; ++i) {
	
		j = i - 1;//有序最后一个元素的下标
		temp = arr[i];
		while (j >= 0 && arr[j] > temp) {
			arr[j + 1] = arr[j];//不满足 就后移
			j--;
		}

		
		arr[j + 1] = temp;
		
	}
}



希尔排序


/*

插入排序的优化
*/
template<typename T>
void ShellSort(T *arr,size_t size ) {
	
	int i, j;
	T  temp;
	int gap;//定义步长 一般为数组大小的一半

	for (gap = size / 2; gap > 0; gap /= 2) {
		
		for (i = gap; i < size; ++i) {

			j = i - gap;
			temp = arr[i];

			while (j >= 0 && arr[j] > temp) {
				arr[j + gap] = arr[j];
				j -= gap;
			}
			
			arr[j + gap] = temp;
		}
	}
	
}

归并排序

//利用分而治之的思想 :归并 + 递归
void Merge(int* arr, int left, int mid, int right) {
	
	int low = left;
	int high = right;
	
	int length = high - left + 1;
	//开一个辅助数组 存放临时结果
	int index = 0;
	vector<int> temp(length);

		
		while (left <= mid && high <= right) {
			
			if (arr[low] < arr[high]) {
				
				temp[index++] = arr[low++];
				
			}
			else {
				temp[index++] = arr[high++];
			}

		}

		//左边有剩余
		while (low <= mid) {

			temp[index++] = arr[low++];
			
		}

		//右边有剩余
		while (high <= right) {
			
			temp[index++] = arr[high++];
		}

		//保存最终结果
		for (int i = 0; i < length; ++i) {

			arr[left + i] = temp[i];
		}
		
	


	


}


void MergeSort(int *arr,int left,int right) {

	if (left < right) {
			
		//1.分割
		int mid = (left + right) / 2;

		MergeSort(arr,left,mid);
		MergeSort(arr, mid + 1, right);

		//2.合并
		Merge(arr,left,mid,right);

		
	}
	

	return;
}

快速排序

template<typename T>
void quickSort(T *arr, int left, int right){
	
	
	if (left < right) {
		int i = left;
		int j = right;
		int temp = arr[i];//保存第一个 作为基准值
		while (i < j) {

			while (i < j && arr[j] > temp) {//左边排序
				j--;
			}//要么左边小于右边 要么arr[j] < temp 退出

			if (i < j) {

				arr[i++] = arr[j];//将不满足条件 放入正确的位置
			}


			while (i < j && arr[i] < temp) {//右边排序

				i++;

			}//要么左边小于右边 要么 arr[i] > temp 
			if (i < j) {

				arr[j--] = arr[i];//将不满足条件的 放入正确的位置
			}


			arr[i] = temp;



			}

		//递归左边 排序
		quickSort(arr, left, i - 1);
		//递归右边 排序
		quickSort(arr, i + 1, right);

		
	}

}

堆排序


二叉排序树


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值