您的位置:首页 > 其它

一些常用算法[数组全排列算法,单链表反转(递归实现),字符串反转,桶排序]

2012-05-22 09:30 811 查看
using System;
using System.Collections;
using System.Collections.Generic;

namespace Arrange
{
class Program
{
static void Main(string[] args)
{

#region 1。全排列算法
//string[] teststring = new string[] { "a", "b", "c", "d" };

//Arrage(teststring, 0, teststring.Length);

//Console.ReadLine();
#endregion

#region 2。单链表反转(递归)

//LinkList<int> lk = new LinkList<int>();
//lk.Append(1);
//lk.Append(2);
//lk.Append(3);
//lk.Append(4);
//lk.Append(6);
//lk.Append(7);
//lk.Append(8);
//lk.Append(9);

//Node<int> head = lk.Head;
//while (head != null)
//{
//    Console.Write(string.Format("{0},", head.Data));
//    head = head.Next;
//}
//head = lk.Head;
//Console.WriteLine();

//Node<int> reservedlink = Reserve(head);
//while (reservedlink != null)
//{
//    Console.Write(string.Format("{0},", reservedlink.Data));
//    reservedlink = reservedlink.Next;
//}
//Console.WriteLine();

//Console.ReadLine();

//return;
#endregion

#region 3。字符串反转
//string a = "abc";

//Console.WriteLine(a);
//a = ReserverString(a);
//Console.WriteLine(a);

//Console.ReadLine();
#endregion

#region 4. QuickSort
////int[] intarr = new int[] { 11, 22, 2, 3, 1, 4, 6, 8 };
//int[] intarr = new int[] { 3, 5, 1, 2, 4, 8, 6, 7, 9, 10, 19, 17, 18, 14, 15, 16, 20, 11, 12, 13 };
//QuickSort(intarr, 0, intarr.Length - 1);

//for (int i = 0; i < intarr.Length; i++)
//{
//    Console.Write(intarr[i].ToString() + ",");
//}

#endregion

#region 5.桶排序

int maxnum = 20;
int nullvalue = 0; //一个标记,确保数组中任何元素的值都不等于这个值。
int[] intarr = new int[] { 3, 5, 1, 2, 4, 8, 6, 7, 9, 10, 19, 17, 18, 14, 15, 16, 20, 11, 12, 13 };
TongSort(intarr, maxnum, nullvalue);
for (int i = 0; i < intarr.Length; i++)
{
Console.Write(intarr[i].ToString() + ",");
}

#endregion

Console.ReadLine();
}

#region 1。全排列算法

/// <summary>
/// 交换
/// </summary>
/// <param name="arr"></param>
/// <param name="i"></param>
/// <param name="j"></param>
static void Swap(string[] arr, int i, int j)
{
if (i != j)
{
string tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}

/// <summary>
/// 排列/打印
/// </summary>
/// <param name="arr"></param>
/// <param name="str"></param>
/// <param name="m"></param>
static void Arrage(string[] arr, int str, int m)
{
if (str == m - 1)
{
//print
foreach (string t in arr)
Console.Write(string.Format("{0},", t));
Console.WriteLine();
}
else
{
for (int i = str; i < m; i++)
{
Swap(arr, str, i);
Arrage(arr, str + 1, m);
Swap(arr, str, i);
}
}
}

#endregion

#region 2。单链表反转(递归)

#region 反转算法(递归)
static Node<int> Reserve(Node<int> singlelink)
{
if (singlelink.Next == null)
return singlelink;

Node<int> l = Reserve(singlelink.Next);
singlelink.Next.Next = singlelink;
singlelink.Next = null;
return l;
}
#endregion

#region 单链表结构定义

//定义单链表的结点
//结点存储数据和下一个结点的地址(引用).这里用一个类表示.
public class Node<T>
{
private T data;  //数据
private Node<T> next; //引用

//构造器
public Node(T val, Node<T> p)
{
data = val;
next = p;
}

//构造器2
public Node(Node<T> p)
{
next = p;
}

//构造器3
public Node(T val)
{
data = val;
next = null;
}

//构造器4
public Node()
{
data = default(T);
next = null;
}

//数据域属性
public T Data
{
get
{
return data;
}
set
{
data = value;
}
}

//引用域属性
public Node<T> Next
{
get { return next; }
set { next = value; }
}
}

//单链表类--定义操作结点的一些方法(如删除, 插入等).
//IList<T>是.net自带的一个接口. 这里实现了这个接口.
public class LinkList<T>
{
private Node<T> head;  //单链表的头引用

//头引用 属性
public Node<T> Head
{
get { return head; }
set { head = value; }
}

//构造器
public LinkList()
{
head = null;
}

///<summary>
///求单链表的长度
///需要从表头开始, 一个结点一个结点遍历,直到表的末尾.
///</summary>

public int GetLength()
{
Node<T> p = head;

int len = 0;
while (p != null)
{
++len;
p = p.Next;
}

return len;
}

///<summary>
/// 清空单链表
/// head=null即可.
/// 单链表清空后,原来结点所占用的空间不会一直保留, 而由垃圾回收器进行回收.
///</summary>
public void Clear()
{
head = null;
}

///<summary>
/// 判断单链表是否为空
/// head==null,即为空
///</summary>
public bool IsEmpty()
{
if (head == null)
{
return true;
}
else
{
return false;
}
}

///<summary>
///附加操作
///在单链表的末尾添加新元素
/// </summary>
public void Append(T item)
{
Node<T> q = new Node<T>(item);
Node<T> p = new Node<T>();

if (head == null)
{
head = q;
return;
}

p = head;
while (p.Next != null)
{
p = p.Next;
}

p.Next = q;
}

//在单链表的第 i 个结点位置前插入一个值为 item 的结点.
public void Insert(T item, int i)
{
if (IsEmpty() || i < 1)
{
Console.WriteLine("List is empty or Position is error!");
return;
}

//就一个head元素.(插入到head前即可)
if (i == 1)
{
Node<T> q = new Node<T>(item);
q.Next = head;
return;
}

//非head(中间某一元素前插入P)
Node<T> p = head;
Node<T> r = new Node<T>();
int j = 1;

while (p.Next != null && j < i)
{
r = p;
p = p.Next;
++j;
}

if (j == i)
{
Node<T> q = new Node<T>(item);
q.Next = p;
r.Next = q;
}

}

//在单链表的第 i 个结点的位置后插入一个值为 item的结点.
public void InsertPost(T item, int i)
{
if (IsEmpty() || i < 1)
{
Console.WriteLine("List is empty or Position is error!");
return;
}

if (i == 1)
{
Node<T> q = new Node<T>(item);
q.Next = head.Next;
head.Next = q;
return;
}

Node<T> p = head;
int j = 1;

while (p != null && j < i)
{
p = p.Next;
++j;
}

if (j == i)
{
Node<T> q = new Node<T>(item);
q.Next = p.Next;
p.Next = q;
}
}

//删除单链表的第 i 个结点
public T Delete(int i)
{
if (IsEmpty() || i < 0)
{
Console.WriteLine("Link is empty or Position is error!");
return default(T);
}

Node<T> q = new Node<T>();
if (i == 1)
{
q = head;
head = head.Next;
return q.Data;
}

Node<T> p = head;
int j = 1;

//从头一直找到 i 所在的位置
//条件是: (1).单链表没有到末尾, (2).还没有到 i 所在的位置 ( j< i).
while (p.Next != null && j < i)
{
++j;
q = p;
p = p.Next;
}

if (j == i)
{
q.Next = p.Next;
return p.Data;
}
else
{
Console.WriteLine("The item node is not exist!");
return default(T);
}
}

//获得单链表的第 i 个数据元素
public T GetElem(int i)
{
if (IsEmpty())
{
Console.WriteLine("List is empty!");
return default(T);
}

Node<T> p = new Node<T>();
p = head;
int j = 1;

while (p.Next != null & j < i)
{
++j;
p = p.Next;
}

if (j == i)
{
return p.Data;  //找到了.
}
else
{
Console.WriteLine("The item node is not exist!");
return default(T);
}
}

///<summary>
///在单链表中查找值为 value 的结点
///</summary>
public int Locate(T value)
{
if (IsEmpty())
{
Console.WriteLine("List is Empty!");
return -1;
}

Node<T> p = new Node<T>();
p = head;
int i = 1;
while (!p.Data.Equals(value) && p.Next != null)
{
p = p.Next;
++i;
}

return i;
}
}
#endregion

#endregion

#region 3。字符串反转
static string ReserverString(string str)
{
int n = str.Length;
System.Text.StringBuilder sb = new System.Text.StringBuilder(str);

for (int i = 0; i < n / 2; i++)
{
char c = sb[i];
sb[i] = sb[n - i - 1];
sb[n - i - 1] = c;
}
return sb.ToString();
}
#endregion

#region 4. QuickSort
static void QuickSort(int[] arr, int low, int high)
{
if (low < high)
{
int partition = PartitionArr(arr, low, high);
QuickSort(arr, low, partition - 1);
QuickSort(arr, partition + 1, high);
}
}

static int PartitionArr(int[] arr, int low, int high)
{
int partition = arr[low];

while (low < high)
{
while (high > low)
{
if (arr[high] < partition)
{
arr[low] = arr[high];
low++;
break;
}
else
{
high--;
}
}
while (low < high)
{
if (arr[low] > partition)
{
arr[high] = arr[low];
high--;
break;
}
else
{
low++;
}
}
}
arr[low] = partition;
return low;
}

#endregion

#region 5.桶排序

static void TongSort(int[] arr, int maxnum, int nullvalue)
{
int[] t = new int[maxnum + 1];
//初始化
if (nullvalue != 0)
for (int i = 0; i < t.Length; i++)
t[i] = nullvalue;

for (int i = 0; i < arr.Length; i++)
{
t[arr[i]] = arr[i];
}

int idx = 0;
for (int i = 0; i < t.Length; i++)
{
if (t[i] != nullvalue)
{
arr[idx++] = t[i];
}
}
}

#endregion
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: