C++ 算法教程

归并排序
cpp 复制代码
#include<iostream>
using namespace std;
template <class T>
void Merge(T data[],int start,int mid,int end)
{
	int len1 = mid - start + 1, len2 = end - mid;
	int i, j, k;
	T* left = new int[len1];
	T* right = new int[len2];
	for (i = 0; i < len1; i++)
		left[i] = data[i + start];
	for (i = 0; i < len2; i++)
		right[i] = data[i + mid + 1];
	i = 0, j = 0;
	for (k = start; k < end; k++)
	{
		if (i == len1 || j == len2)
			break;
		if (left[i] <= right[j])
			data[k] = left[i++];
		else
			data[k] = right[j++];
	}
	while (i < len1)
		data[k++] = left[i++];
	while (j < len2)
		data[k++] = right[j++];
	delete[] left;
	delete[] right;
}
template <class T>
void MergeSort(T data[], int start, int end)
{
	if (start < end)
	{
		int mid = (start + end) / 2;
		MergeSort(data, start,mid);
		MergeSort(data, mid + 1, end);
		Merge(data, start, mid, end);
	}
}
void show(int*temp,int n)
{
	for (int i = 0; i < n; i++)
		cout << temp[i] << "  ";
}
void main()
{
	int temp[8];
	for (int i = 0; i < 8; i++)
		cin >> temp[i];
	MergeSort<int>(temp, 0,7);
	show(temp, 8);
}

冒泡排序_相邻交换

cpp 复制代码
#include <stdio.h>  
  
int main()  
{  
    int i,p,temp;  
    int array[10] = {2,6,1,9,4,7,5,8,3,0};  
    printf("Display this array:\n");  
    for(i=0;i<10;i++)  
    {  
        printf("%d ",array[i]);  
    }  
    for(i = 1;i < 10; ++i)
{
   for(p = 0; p < 10; ++p)
  {
       if(array[i]>array[p])
      {
	array[i] = 	array[i]^array[p];
	array[p] = array[i]^array[p];	
	array[i] = array[i]^array[p];
      }
  }
}
    printf("\n");  
    printf("After sorting,this array is:\n");  
    for(i=0;i<10;i++)  
    {  
        printf("%d ",array[i]);  
    }     
    printf("\n");  
    return 0;  
}  
判断循环链表

1.建立set集合,每次遍历存储元素,当集合大小不变,但循环仍在继续时说明存在循环,并得出该位置

2.定义双指针遍历:一个指针每次移动一个节点,一个指针每次移动2个节点,当2个节点指针在一个节点指针后面时,此链表存在循环。

3.链表反向

4.构造双向链表

swap

a:1001

b:1100

a=a^b; a:0101

b=a^b; b:1001

a=a^b; a:1100

a = a + b;

b = a - b;

a = a - b;

直插排序
cpp 复制代码
#include <stdio.h>  
  
int main()  
{  
    int i,p,temp;  
    int array[10] = {2,6,1,9,4,7,5,8,3,0};  
    printf("Display this array:\n");  
    for(i=0;i<10;i++)  
    {  
        printf("%d ",array[i]);  
    }  
      	//选择第一个数做为起始排序
	for(i = 1; i < 10; ++i)
	{
		temp = array[i];	//待插入排序数
		for(p = i-1; p >=0 && array[p]>temp; --p)
		{//遍历已排序数列表
			{//如果当前数大小在已排序范围中,开始向右位移一个数让出空间
				array[p+1] = array[p];	
			}
		}
		//找到待排序数的位置,在让出的空间直接插入		
		array[p+1]=temp;			
	}
    printf("\n");  
    printf("After sorting,this array is:\n");  
    for(i=0;i<10;i++)  
    {  
        printf("%d ",array[i]);  
    }     
    printf("\n");  
    return 0;  
}  
cpp 复制代码
#include <stdio.h>  
  
int main()  
{  
    int i,j,t;  
    int array[10]={2,7,1,8,5,9,3,4,0,6};  
    printf("\nDisplay this array:\n");  
    for(i=0;i<10;i++)  
    {  
        printf("%d ",array[i]);  
    }  
    printf("\n");  
    for(i=1;i<=9;i++)  
    {  //遍历
        int t = i-1;  //假设当前数为最小数
        for(j=i;j<10;j++)  
        {  
            if(array[j]<array[t])  
            {  //遍历找到最小的数,保存最小数索引
                t=j;  
            }  
        }  
        if(t!=(i-1))  
        {  //交换最小数与假设最小数
            int temp = 0;  
            temp=array[i-1];  
            array[i-1]=array[t];  
            array[t]=temp;  
        }  
    }  
    printf("After sorting,this array is:\n");  
    for(i=0;i<10;i++)  
    {  
        printf("%d ",array[i]);  
    }  
    printf("\n");  
    return 0;  
}  

https://github.com/sashafierce/100-days-of-Algorithm-Challenge

GitHub - hackerkid/Awesome-Data-Structures: C++ implementation of basic data structures and algorithms

GitHub - hackerkid/LightOJ-Solutions: :sparkles: LightOJ Solutions with hints

GitHub - mmc-maodun/Data-Structure-And-Algorithm: Data Structure And Algorithm(常用数据结构与算法C/C++实现)

https://leetcode.com/

Codewars - Achieve mastery through coding practice and developer mentorship

Khan Academy | Free Online Courses, Lessons & Practice

https://github.com/sashafierce/Algo_Ds_Notes

位操作基础篇之位操作全面总结_c++位操作-CSDN博客

https://www.cnblogs.com/findumars/p/5180528.html


创作不易,小小的支持一下吧!

相关推荐
Scott9999HH2 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
2401_841495643 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
fqbqrr3 小时前
2607C++,soui与安卓
c++·soui
码智社3 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海3 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖4 小时前
JDK 26 新特性详解
java·开发语言
马优晨5 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
fqbqrr7 小时前
2607C++,使用微软detours勾挂工具
c++
人邮异步社区7 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大7 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf