一、排序算法
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];
}
}
}
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];
}
}
}
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;
}
}
}
}
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];
}
}
}
}
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);
}
}
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];
}
}
}
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);
}
}
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);
}
}
二、查找
1、顺序查找
int Find(int arr[],int target,int length){
for(int i=0;i<length;i++){
if(arr[i]==target) return i;
}
return -1;
}
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;
}
三、数值转换
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;
}
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;
}
其它进制可以由十进制转换
四、串
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];
}
}
}
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];
}
}
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;
}
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
}
}
五、学过的一些简单程序
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;
}