插入排序:
void InsertSort(int a[], int len)
{int j;
for (int i = 2; i <= len; i++)
{
a[0] = a[i];
for (j = i - 1; a[0] < a[j]; j--)
a[j + 1] = a[j];
a[j + 1] = a[0];
}
for (int x = 1; x <= len;x++)
cout << a[x]<<" ";
}
归并排序:
/*
* 递归方法实现归并排序
* Lzy 2011-5-25
*/
#include <stdio.h>
#define N 8
//归并排序 递归实现
void merge(int X[], int low, int mid, int high) /*两个有序表的合并算法*/
{ //R[low..mid]和R[mid+1..high]是两个有序表
int R1[N]; //临时缓冲区
int i = low, j = mid+1, k = low; //k是Rl的下标,i、j分别为R[low..m]和R[m+1..high]的下标
for(; i <= mid && j <= high; k++) /*依次比较两个了序列中数据元素的大小*/
{
if(X[i] <= X[j]) /*将较小的数移入缓冲区*/
R1[k] = X[i++]; //将R[low..m]中的记录放入R1中
else
R1[k] = X[j++]; //将R[m+1..high]中的记录放入R1中
}
while(i <= mid) //将R[low..m]余下部分复制到R1
R1[k++] = X[i++];
while(j <= high) //将R[m+1..high]余下部分复制到R1
R1[k++] = X[j++];
for(k = low; k <= high; k++) /*将缓冲区中的数据元素复制回原序列中*/
X[k] = R1[k];
}
void Merge_Sort(int X[], int low, int high) /* 定义归并排序函数,递归方式 */
{
int mid;
if(low < high)
{
mid = (low + high) / 2;
Merge_Sort(X, low, mid); /* 递归调用,将子序列x[low~mid]归并为有序序列 */
Merge_Sort(X, mid + 1, high); /* 递归调用,将子序列x[mid+1~high]归并为有序序列 */
merge(X,low,mid,high); /* 将子序列x[low~mid]和x[mid+1~high]进行归并 */
}
}
/******测试程序*******/
int main(void)
{
int i;
int X[N] = {26,23,96,13,36,67,45,15};
Merge_Sort(X,0,7);
for(i = 0; i < 8; i++)
printf("%d ",X[i]);
}
快速排序:
#include <iostream>
using
namespace
std;
void
Qsort(
int
a[],
int
low,
int
high)
{
if
(low >= high)
{
return
;
}
int
first = low;
int
last = high;
int
key = a[first];
/*用字表的第一个记录作为枢轴*/
while
(first < last)
{
while
(first < last && a[last] >= key)
{
--last;
}
a[first] = a[last];
/*将比第一个小的移到低端*/
while
(first < last && a[first] <= key)
{
++first;
}
a[last] = a[first];
/*将比第一个大的移到高端*/
}
a[first] = key;
/*枢轴记录到位*/
Qsort(a, low, first-1);
Qsort(a, first+1, high);
}
int
main()
{
int
a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24};
Qsort(a, 0,
sizeof
(a) /
sizeof
(a[0]) - 1);
/*这里原文第三个参数要减1否则内存泄露*/
for
(
int
i = 0; i <
sizeof
(a) /
sizeof
(a[0]); i++)
{
cout << a[i] <<
""
;
}
return
0;
}
/*参考数据结构p274(清华大学出版社,严蔚敏)*/
PRIM算法:
// dna.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <cmath>
#include <string>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
int N, cost[1001][1001], lowcost[1001], closest[1001];
int prim(int v0)
{
int i, j, mindis, minone;
int ans = 0;/*用来记录最小生成树的总长度*/
/*各点距离初始化*/
for (i = 1; i <= N; i++)
{
lowcost[i] = cost[v0][i];
closest[i] = v0;
}
for (i = 1; i < N; i++)
{
mindis = -1;
for (j = 1; j <= N; j++)
if (lowcost[j] && (mindis > lowcost[j] || mindis<0))
{
mindis = lowcost[j];
minone = j;
}
/*将找到的最近点加入最小生成树*/
ans += lowcost[minone];
lowcost[minone] = 0;
/*修正其他点到最小生成树的距离*/
for (j = 1; j <= N; j++)
if (cost[j][minone] < lowcost[j])
{
lowcost[j] = cost[j][minone];
closest[j] = minone;
}
}
return ans;
}
int main(){
cin >> N;
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++)
cin >> cost[i][j];
cout << prim(1) << endl;
}