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
}
}
一些常用算法[數組全排列算法,單鏈表反轉(遞歸實現),字符串反轉,桶排序]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.