20200705八大排序算法 手撕纪要快排归并插入冒泡

1.https://www.jianshu.com/p/e136ec79235c
红黑树的组成 ,旋转,变色
查找 ,插入和删除
先放着 容我把排序手撕搞清楚

  1. 开始排序
    (1) 冒泡排序 最简单
void bubbleSort(vector<int> &a)
{
    int len = a.size();
    for (int i = 0; i < len - 1; i++) //需要循环次数
    {
        for (int j = 0; j < len - 1 - i; j++) //每次需要比较个数
        {
            if (a[j] > a[j + 1])
            {
                swap(a[j], a[j + 1]); //不满足偏序,交换
            }
        }
    }
}

自己写的

#include<iostream>
#include<vector>

using namespace std;
void pop_sort(vector<int>& data, int n) {
	int i, j, temp;
	for (i = 0;i < n - 1;i++) {
		for (j = 1;j < n-i;j++) {
			if (data[j - 1] > data[j]) {
				temp = data[j - 1];
				data[j - 1] = data[j];
				data[j] = temp;
			}
		}
	}
}
int main() {
	int n;
	cin >> n;
	vector<int>data(n);
	for (int i = 0;i < n;i++) {
		cin >> data[i];
	}
	pop_sort(data, n);

	for (int i = 0;i < n;i++) {
		cout << data[i] << " ";
	}
	
	return 0;
}


(2)插入排序
就是说对每一个选中的数 插入到合适的位置上去

#include<iostream>
#include<vector>

using namespace std;

int main() {
	int n;
	cin >> n;
	vector<int>data(n);
	for (int i = 0;i < n;i++) {
		cin >> data[i];
	}
	int i, j;
	for (i = 1;i < n;i++) {
		int temp = data[i];
		for (j = i - 1;j >= 0 && data[j] > temp;j--) {
			data[j+1] = data[j];
		}
		data[j+1] = temp;
	}
	for (int i = 0;i < n-1;i++) {
		cout << data[i] << " ";
	}
	cout << data[n - 1]<<endl;
	return 0;
}

(3) 归并排序

归并排序的方法就是说我们需要分而治之 分 治 然后合起来 就这么简单
最后合并的过程就是这个merge函数的层层 返回上层

void merge(int arr[], int left, int mid, int right)
{   
    std::vector<int> *result = new std::vector<int>();
    int l = left;
    int m = mid;
    while(l <= mid -1 && m <= right)
    {  
        if( arr[l] <= arr[m] ){
            result->push_back(arr[l++]);
        }           
        else {
            result->push_back(arr[m++]);
        }   
    }  
    while(l <= mid -1){
        result->push_back(arr[l++]);
    }  
    while(m <= right){
        result->push_back(arr[m++]);
    }
    for(auto item : *result)
    {                                                      
        arr[left++] = item;
    }
}   
    
void mergeSort(int arr[], int left, int right)
{   
    if( right - left < 2) 
    {
        if( arr[left] > arr[right])
        {
            std::swap(arr[left], arr[right]);
        }
        return ;
    }
    int m = (right + left)/ 2 ;
    mergeSort(arr, left, m);
    mergeSort(arr, m+1, right);
    merge(arr, left, m+1, right);
}   
    
int main()
{   
    int test[10];
    for(int i = 0; i < 10; ++i)
    {
        test[i] = std::rand()%100;
    }
    std::cout <<"排序前"<< std::endl;
    for(int i = 0; i < 10; ++i)
    {
        std::cout << test[i]<<" " ;
    }
    std::cout << std::endl;
    mergeSort(test,0,9);
    std::cout <<"排序后"<< std::endl;                                                   
    for(int i = 0; i < 10; ++i)
    {
        std::cout << test[i]<<" " ;
    }
    std::cout << std::endl;
return 0;
} 

参考文献
https://blog.csdn.net/helloworld_ptt/article/details/84332343

(4)快速排序 也是用分治方法

快速排序 这个真的厉害 找一个基准值 然后通过比较交换把小于的和大于的放在两边
继续进行


void quick_sort(vector<int>& data, int low, int high) {
	
	int i, j, pivot;
	if (low < high) {
		i = low;
		j = high;
		pivot = data[low];
		while (i < j) {
			while (i < j && data[j] >= pivot) {
				j--;
			}
			if (i < j) { data[i++] = data[j]; }
			while (i < j && data[i] <= pivot) {
				i++;
			}
			if (i < j) { data[j--] = data[i]; }
		}
		data[i] = pivot;
		quick_sort(data, low, i - 1);
		quick_sort(data, i + 1, high);
	}

}

参考文献
https://www.cnblogs.com/miracleswgm/p/9199124.html

(5) 选择排序

void select_sort(vector<int>& data, int n) {
	int i, j, x, l;
	for (i = 0;i < n;i++) {
		x = data[i];
		l = i;
		for (j = i + 1;j < n;j++) {
			if (data[j] < x) {
				x = data[j];
				l = j;
			}
		}
		data[j] = data[i];
		data[i] = x;
	}

}

(6) 希尔排序
就是分组插入排序
分治思想用在插入排序上

(7 )堆排序

// 堆排序
// 调整堆,根元素沿树向下移动,直至其合适位置,first和last分别为堆顶和堆底在数组array中的索引
void moveDown(vector<int>& array, int first, int last){
    // first的左子节点索引
    int curIndex = first * 2 + 1;
    while (curIndex <= last){
        // 若first有2子节点,令curIndex为其值最大子节点索引
        if (curIndex < last && array[curIndex] < array[curIndex + 1]){
            curIndex++;
        }
        // 若根节点值小于子节点值,则交换
        if (array[first] < array[curIndex]){
            swap(array[first], array[curIndex]);
            first = curIndex;
            curIndex = first * 2 + 1;
        }
        else{
            break;
        }
    }
}
// 用数组实现堆
void buildHeap(vector<int>& array){
    // 最后一个非叶节点的节点索引
    int i = array.size() / 2 - 1;
    while (i >= 0){
        moveDown(array, i, array.size() - 1);
        i--;
    }
}
// 堆排序
void heapSort(vector<int>& array){
    // 生成堆
    buildHeap(array);
    // 堆顶、底索引
    int first = 0, last = array.size() - 1;
    while (first <= last){
        swap(array[first], array[last]);
        last--;
        moveDown(array, first, last);
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值