数据结构与算法复习

一、排序算法

1、插入排序

1)直接插入排序
void InsertSort(int arr[], int n){
    int i,j;
    for(i=2;i<=n;i++){
        if(arr[i]<arr[i-1]){
            arr[0] = arr[i];
            arr[i] = arr[i-1];
            for(j=i-2;j>0&&arr[j]>arr[0];j--){
                arr[j+1]=arr[j];
            }
            arr[j+1] = arr[0];
        }
    }
}

InsertSort

2)折半插入排序
 void BInsertSort(int arr[], int n){
  int i,j,low,height,mid;  for(i=2;i<=n;i++){
      if(arr[i]<arr[i-1]){
          arr[0] = arr[i];
          low = 1,height = i-1;
          while(low<=height){
              mid = low+(height-low)/2;
              if(arr[mid]>arr[0]) height = mid-1;
              else low = mid+1;
          }
          for(j=i-1;j>height;j--){
              arr[j+1]=arr[j];
          }
          arr[j+1] = arr[0];
      }
  }
 }

BInsertSort

3)希尔排序
void ShellInsert(int arr[],int n){
    for(int gap = (n+1)/2;gap>0;gap/=2){
        for(int i=gap;i<=n;i++){
            int j = i;
            while(j-gap>0&&arr[j]<arr[j-gap]){
                arr[0] = arr[j];
                arr[j] = arr[j-gap];
                arr[j-gap] = arr[0];
                j-=gap;
            }
        }
    }
}

ShellInsert

2、交换排序

1)起泡法
void BubbleSort(int arr[],int n){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n-i+1;j++){
            if(arr[j]>arr[j+1]){
                arr[0] = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = arr[0];
            }
        }
    }
}

BubbleSort

2)快速排序
int Partition(int arr[] ,int low ,int high){
    int tmp = arr[low];
    while(low<high){
        while(low<high&&arr[high]>=tmp){
            high--;
        }
        arr[low]=arr[high];
        while(low<high&&arr[low]<=tmp){
            low++;
        }
        arr[high]=arr[low];
    }
    arr[low] = tmp;
    return low;
}
void QuickSort(int arr[] ,int low ,int high){
    if(low<high){
        int index = Partition(arr,low,high);
        QuickSort(arr,low,index-1);
        QuickSort(arr,index+1,high);
    }
}

QuickSort

3、选择排序

1)简单选择排序
void SelectSort(int arr[] ,int n){
    int minValue;
    for(int i=1;i<n;i++){
        minValue = i;
        for(int j=i+1;j<=n;j++){
            if(arr[minValue]>arr[j]){
                minValue=j;
            }
        }
        if(minValue!=i){
            arr[0] = arr[i];
            arr[i] = arr[minValue];
            arr[minValue] = arr[0];
        }
    }
}

SelectSort

2)堆排序(大根堆)
void HeapAdjust(int arr[],int s,int m){
	int rc = arr[s];
	for(int j=2*s;j<=m;j*=2){
		if(j<m&&arr[j]<arr[j+1]) ++j;
		if(rc>=arr[j]) break;
		int temp = arr[s];
		arr[s] = arr[j];
		arr[j] = temp;
		s = j;
	}
	arr[s] = rc;
}
void CreatHeap(int arr[],int n){
	for (int i=n/2;i>0;--i){
		HeapAdjust(arr,i,n);
	}
}

void HeapSort(int arr[],int n){
	CreatHeap(arr,n);
	for (int i=n;i>1;--i){
		arr[0] = arr[1];
		arr[1] = arr[i];
		arr[i] = arr[0];
		HeapAdjust(arr,1,i-1);
	}
}

HeapSort

4、归并排序

void Merge(int arr[] ,int left ,int mid ,int right ,int temp[]){
    int i=left;
    int j = mid+1;
    int t = 0;
    while(i<=mid&&j<=right){
        temp[t++]=arr[i]<arr[j]?arr[i++]:arr[j++];
    }
    while(i<=mid){
        temp[t++]=arr[i++];
    }
    while(j<=right){
        temp[t++]=arr[j++];
    }
    t=0;
    while(left<=right){
        arr[left++]=temp[t++];
    }
}
void MSort(int arr[] ,int left,int right, int temp[]){
    if(left<right){
        int mid = left+(right-left)/2;
        MSort(arr,left,mid,temp);
        MSort(arr,mid+1,right,temp);
        Merge(arr,left,mid,right,temp);
    }
}

MSort

二、查找

1、顺序查找

int Find(int arr[],int target,int length){
	for(int i=0;i<length;i++){
		if(arr[i]==target) return i;
	}
	return -1;
}

Find

2、二分查找

int Find(int arr[],int target,int length){
	int left = 0,right = length-1;
	while(left<=right){
		int mid = left+(right-left)/2;
		if(arr[mid]==target) return mid;
		if(arr[mid]>target) right = mid -1;
		else left = mid+1;
	}
	return -1;
}

BFind

三、数值转换

1、十进制转二、四、八,十六进制:

#include <iostream>
#include <math.h>
#include "SeqStack.h"
using namespace std;
int main(){
	int num;
	SeqStack <int> b;
	cout<<"输入一个十进制数"<<endl;
	cin>>num;
//	十进制转二进制 
	int num2 = num;
	while(num2){
		b.Push(num2%2);
		num2/=2;
	}
	cout<<"该十进制数对应的二进制数为:";
	while(!b.Empty()){
		cout<<b.Pop();
	}
	cout<<endl;
	
//	十进制转四进制 
	int num4 = num;
	while(num4){
		b.Push(num4%4);
		num4/=4;
	}
	cout<<"该十进制数对应的四进制数为:";
	while(!b.Empty()){
		cout<<b.Pop();
	}
	cout<<endl;
	
//	十进制转八进制 
	int num8 = num;
	while(num8){
		b.Push(num8%8);
		num8/=8;
	}
	cout<<"该十进制数对应的八进制数为:";
	while(!b.Empty()){
		cout<<b.Pop();
	}
	cout<<endl;
    
//	十进制转十六进制
	SeqStack <char> c;
	char sixteen(int);
	int k = 0; 
	int num16 = num;
	while(num16){
		c.Push(sixteen(num16%16));
		num16/=16;
		k++;
	}
	cout<<"该十进制数对应的十六进制数为:";
	while(!c.Empty()){
		cout<<c.Pop();
	}
}
char sixteen(int num){
	char ch;
	switch (num){
	  case 10: ch='A'; break;
      case 11: ch='B'; break;
      case 12: ch='C'; break;
      case 13: ch='D'; break;
      case 14: ch='E'; break;
      case 15: ch='F'; break;
      default: ch=num+'0';break;
    }
    return ch;
}

SeqStack.h

2、十六进制转二、四、八,十进制:

#include <iostream>
#include <math.h>
#include <string.h>
#include "SeqStack.h"
using namespace std;
int main()
{
	int n=0,k,j=0;char a[20];
	string s;
	SeqStack <int> b;
	cout<<"输入一个十六进制数"<<endl;
	cin>>s;
	k=s.size();//字符串的长度 
//将十六进数转化成十进制数 
	while(k){
		switch (s[s.size()-k]){
	  		case 'A':n=n+pow(16,k-1)*10; break;
      		case 'B': n=n+pow(16,k-1)*11; break;
      		case 'C': n=n+pow(16,k-1)*12; break;
      		case 'D': n=n+pow(16,k-1)*13; break;
      		case 'E': n=n+pow(16,k-1)*14; break;
      		case 'F': n=n+pow(16,k-1)*15; break;
      		default: n=n+pow(16,k-1)*(s[s.size()-k]-'0');break;
    	}
		k--;
	}
	cout<<"该十六进制数转化为十进制数为:" <<n<<endl;
}

SeqStack.h

其它进制可以由十进制转换

四、串

1、求给定一个串的

1)next值(:next[0]=-1)
void GetNext(string &str, int next[]){
	next[0] = -1;
	int i = 0, j = -1;

	while (i < str.size()-1){//前一位比较完就行了,最后一位比的话就越界了
		if (j == -1 || str[i] == str[j]){
			++i;
			++j;
			next[i] = j;
		}	
		else{
			j = next[j];
		}
	}
}

Next

2)nextval值
void GetNextval(string &str, int nextval[]){
	nextval[0]=-1;
	int i = 0, j = -1;
	
	while(i < str.size()-1){
		if (j == -1 || str[i] == str[j]){
			++i;
			++j;
			if(str[i]!=str[j]) nextval[i] = j;
			else nextval[i] = nextval[j];
		}
		else j = nextval[j];
	}
}

nextval

2、BF算法

int BF(string &M, string &N)
{
    int i=0, j=0;
    while (M[i] != '\0' && N[j] != '\0')
    {
        if (M[i] == N[j])
        {
            i++; j++;
        }
        else
        {
            i = i - j + 1;
            j = j - j;  //也就是j=0
        }
    }
    if (N[j] == '\0')
    {
        return (i - j);
    }
    else
        return -1;
}

BF

3、KMP算法

int KMP(string &str1, string &str2,int next[])//str1表示主串,str2表示模式串
{
	int m = str1.size(), n = str2.size();
	GetNext(str2, next);//求解next数组
	int i = 0, j = 0;
	while (i < m && j < n) {
		if (j == -1 || str1[i] == str2[j]) {
			++i;
			++j;
		}
		else {
			j = next[j];
		}
	}
	if (j == n) {
		return i - j;//返回模式串在主串的起始位置
	}
	else {
		return -1;//没有找到返回-1
	}
}

KMP

五、学过的一些简单程序

1、判断素数

#include <iostream>
using namespace std;
int main(){
  int n, i;
  bool isPrime = true;
  cout << "输入一个正整数: ";
  cin >> n;
  for(i = 2; i <= n / 2; ++i){
      if(n % i == 0)
      {
          isPrime = false;
          break;
      }
  }
  if (isPrime)
      cout << "是素数";
  else
      cout << "不是素数";
  return 0;
}

2、求N以内的素数的和(包括N)

#include<iostream>
using namespace std;
int main()
{
	int n,sum=0;
	cin>>n;
	for(int i = 2; i <= n; ++i)
	{		
		int k;
		for(k = 2; k < n; ++k)
		if(i%k == 0) break;//如果找到一个因子k能将i除尽则跳出
		if(k == i)//表明没有找到任何一个符合要求的因子k,所以为素数
		sum+=i;
	}
    cout<<sum<<endl;
	return 0;
}

3、判断闰年

#include<iostream>
using namespace std;
int main()
{
    int n;
    cout << "cinyear:";
    cin >> n;
    if (n % 100 == 0 && n % 400 == 0 || n % 100 != 0 && n % 4 == 0)
        cout << "runnian" << endl;
    else
        cout << "feirun" << endl;
    return 0;
}

4、阶乘(递归,非递归)

1)递归
#include<iostream>
using namespace std;
int main(){
	int fac(int);
	int i,n;
	cout<<"Enter number: ";
	cin>>n;
	cout<<"Factorial of "<<n<<" is: "<<fac(n);
	return 0;
}
int fac(int i){
	
//    int f;
//    if(i==0||i==1) f=1;
//    else f = fac(i-1)*i;
//    return f;

	if(i==0||i==1) return 1;
	return fac(i-1)*i;
}
2)非递归
#include<iostream>
using namespace std;
int main()
{     
	int i,fac,n;
	cout<<"Enter number: ";
	cin>>n;
	for(i=1,fac=1;i<=n;++i)
	{
		fac=i*fac;
	}
	cout<<"Factorial of "<<n<<" is: "<<fac;
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值