算法基础
2.1 插入排序
C++实现:
#include<iostream>
using
namespace
std;
void
InsertSort(
int
arr[],
int
n)
{
int
i,j,key;
for
(i=1;i<n;++i)
{
key=arr[i];
j=i-1;
while
(j>=0&&key<arr[j])
{
arr[j+1]=arr[j];
j--;
}
arr[j+1]=key;
}
}
int
main()
{
int
arr[10]={14,25,53,23,2,6,74,34,67,39};
InsertSort(arr,10);
for
(
auto
a:arr)
cout<<a<<
' '
;
cout<<endl;
}
2.3 分治法
合并操作代码
#include<iostream>
using
namespace
std;
void
Merge(
int
arr[],
int
p,
int
q,
int
r)
{
int
i=0,j=0;
int
k;
int
n1=q-p+1;
int
n2=r-q;
int
temp[r-p+1];
for
(k=0;k<r-p+1;++k)
{
if
(i<n1&&j<n2&&arr[p+i]<=arr[q+1+j])
{
temp[k]=arr[p+i];
i++;
}
else
if
(i<n1&&j<n2&&arr[p+i]>arr[q+1+j])
{
temp[k]=arr[q+1+j];
j++;
}
else
if
(i==n1||j==n2)
break
;
}
while
(j<n2)
{
temp[k++]=arr[q+1+j];
j++;
}
while
(i<n1)
{
temp[k++]=arr[p+i];
i++;
}
for
(k=0;k<r-p+1;++k)
cout<<temp[k]<<
' '
;
cout<<endl;
}
int
main()
{
int
arr[10]={1,6,9,12,56,2,31,45,67,78};
Merge(arr,0,4,9);
}
2.3.1 合并排序
#include<iostream>
using
namespace
std;
void
Merge(
int
arr[],
int
p,
int
q,
int
r);
void
MergeSort(
int
arr[],
int
p,
int
r)
{
int
q;
if
(p < r)
//只有一个或无记录时不须排序
{
q = (
int
)((p+r)/2);
//将data数组分成两半
MergeSort(arr, p, q);
//递归拆分左数组
MergeSort(arr, q+1, r);
//递归拆分右数组
Merge(arr, p, q, r);
//合并数组
}
}
/*int main()
{
int arr[10]={1,6,8,2,4,9,67,34,27,89};
MergeSort(arr,0,9);
}*/
int
main()
{
int
arr[10]={1,23,55,67,89,2,34,57,76,90};
int
k;
for
(k=0;k<10;++k)
{
cout<<arr[k]<<
" "
;
}
cout<<endl;
MergeSort(arr,0,9);
for
(k=0;k<10;++k)
{
cout<<arr[k]<<
" "
;
}
cout<<endl;
}
void
Merge(
int
arr[],
int
p,
int
q,
int
r)
{
int
i,j,k;
int
n1=q-p+1;
int
n2=r-q;
int
left[n1],right[n2];
for
(i=0; i<n1;i++)
//对左数组赋值
left[i] = arr[p+i];
for
(j=0; j<n2;j++)
//对右数组赋值
right[j] =arr[q+1+j];
i=j=0;
k=p;
while
(i<n1&&j<n2)
{
if
(left[i]<=right[j])
{
arr[k++]=left[i++];
}
else
{
arr[k++]=right[j++];
}
}
while
(j<n2)
{
arr[k++]=right[j++];
}
while
(i<n1)
{
arr[k++]=left[i++];
}
}
或者
//Merge.cpp
#include<iostream>
using
namespace
std;
void
Merge(
int
arr[],
int
p,
int
q,
int
r)
{
int
i=0,j=0;
int
k;
int
n1=q-p+1;
int
n2=r-q;
int
temp[r-p+1];
for
(k=0;k<r-p+1;++k)
{
if
(i<n1&&j<n2&&arr[p+i]<=arr[q+1+j])
{
temp[k]=arr[p+i];
i++;
}
else
if
(i<n1&&j<n2&&arr[p+i]>arr[q+1+j])
{
temp[k]=arr[q+1+j];
j++;
}
else
if
(i==n1||j==n2)
break
;
}
while
(j<n2)
{
temp[k++]=arr[q+1+j];
j++;
}
while
(i<n1)
{
temp[k++]=arr[p+i];
i++;
}
for
(k=0;k<r-p+1;++k)
arr[p++]=temp[k];
}
//MergeSort.cpp
#include<iostream>
using
namespace
std;
void
Merge(
int
arr[],
int
p,
int
q,
int
r);
void
MergeSort(
int
arr[],
int
p,
int
r)
{
int
q;
if
(p < r)
//只有一个或无记录时不须排序
{
q = ((p+r)/2);
//将data数组分成两半
MergeSort(arr, p, q);
//递归拆分左数组
MergeSort(arr, q+1, r);
//递归拆分右数组
Merge(arr, p, q, r);
//合并数组
}
}
/*int main()
{
int arr[10]={1,6,8,2,4,9,67,34,27,89};
MergeSort(arr,0,9);
}*/
int
main()
{
int
arr[10]={1,23,55,67,89,2,34,57,76,90};
int
k;
for
(k=0;k<10;++k)
{
cout<<arr[k]<<
" "
;
}
cout<<endl;
MergeSort(arr,0,9);
for
(k=0;k<10;++k)
{
cout<<arr[k]<<
" "
;
}
cout<<endl;
}