C#排序算法大全
转来的,没有实际跑过最基本的 冒泡排序
using System; namespace BubbleSorter
{
public class BubbleSorter
{
public void Sort(int [] list)
{
int i,j,temp;
bool done=false;
j=1;
while((j<list.Length)&&(!done))
{
done=true;
for(i=0;i<list.Length-j;i++)
{
if(list>list[i+1])
{
done=false;
temp=list;
list=list[i+1];
list[i+1]=temp;
}
}
j++;
}
}
}
public class MainClass
{
public static void Main()
{
int[] iArrary=new int[]{1,5,13,6,10,55,99,2,87,12,34,75,33,47};
BubbleSorter sh=new BubbleSorter();
sh.Sort(iArrary);
for(int m=0;m<iArrary.Length;m++)
Console.Write("{0} ",iArrary[m]);
Console.WriteLine();
}
}
}
选择排序
using System;
namespace SelectionSorter
{
public class SelectionSorter
{
private int min;
public void Sort(int [] list)
{
for(int i=0;i<list.Length-1;i++)
{
min=i;
for(int j=i+1;j<list.Length;j++)
{
if(list[j]<list[min])
min=j;
}
int t=list[min];
list[min]=list;
list=t;
}
}
}
public class MainClass
{
public static void Main()
{
int[] iArrary=new int[]{1,5,3,6,10,55,9,2,87,12,34,75,33,47};
SelectionSorter ss=new SelectionSorter();
ss.Sort(iArrary);
for(int m=0;m<iArrary.Length;m++)
Console.Write("{0} ",iArrary[m]);
Console.WriteLine();
}
}
}
插入排序
using System;
namespace InsertionSorter
{
public class InsertionSorter
{
public void Sort(int [] list)
{
for(int i=1;i<list.Length;i++)
{
int t=list;
int j=i;
while((j>0)&&(list[j-1]>t))
{
list[j]=list[j-1];
--j;
}
list[j]=t;
}
}
}
public class MainClass
{
public static void Main()
{
int[] iArrary=new int[]{1,13,3,6,10,55,98,2,87,12,34,75,33,47};
InsertionSorter ii=new InsertionSorter();
ii.Sort(iArrary);
for(int m=0;m<iArrary.Length;m++)
Console.Write("{0}",iArrary[m]);
Console.WriteLine();
}
}
}
希尔排序 希尔排序是将组分段,进行插入排序
using System;
namespace ShellSorter
{
public class ShellSorter
{
public void Sort(int [] list)
{
int inc;
for(inc=1;inc<=list.Length/9;inc=3*inc+1);
for(;inc>0;inc/=3)
{
for(int i=inc+1;i<=list.Length;i+=inc)
{
int t=list[i-1];
int j=i;
while((j>inc)&&(list[j-inc-1]>t))
{
list[j-1]=list[j-inc-1];
j-=inc;
}
list[j-1]=t;
}
}
}
}
public class MainClass
{
public static void Main()
{
int[] iArrary=new int[]{1,5,13,6,10,55,99,2,87,12,34,75,33,47};
ShellSorter sh=new ShellSorter();
sh.Sort(iArrary);
for(int m=0;m<iArrary.Length;m++)
Console.Write("{0} ",iArrary[m]);
Console.WriteLine();
}
}
}
--------------------编程问答-------------------- 嗯,不错 --------------------编程问答-------------------- 不错的东西,留个脚印。 --------------------编程问答-------------------- --------------------编程问答-------------------- 顶顶 --------------------编程问答-------------------- 谢谢楼主分享 --------------------编程问答-------------------- 谢谢楼主!
收了,有空看看! --------------------编程问答-------------------- 这个好,收拉,谢谢 --------------------编程问答-------------------- 真的不错啊,呵呵,还要连载哦 --------------------编程问答-------------------- 收藏 --------------------编程问答-------------------- 我收藏了,谢谢 --------------------编程问答-------------------- 快速排序
二分排序
堆排序
...
大全? --------------------编程问答-------------------- lou --------------------编程问答-------------------- 毛躁``` --------------------编程问答-------------------- 谢谢分享
--------------------编程问答-------------------- 收藏一下! --------------------编程问答-------------------- 验证一下 --------------------编程问答-------------------- 顶一下 --------------------编程问答-------------------- 学习了。 --------------------编程问答-------------------- 恩,不错`顶了~` --------------------编程问答-------------------- 还是C++搞算法是跟本
LZ辛苦了 --------------------编程问答-------------------- 谢谢分享,收藏到先 --------------------编程问答-------------------- 不错,学习了
--------------------编程问答-------------------- 不错 不错 --------------------编程问答-------------------- 快速排序
Array.Sort --------------------编程问答-------------------- 很不错的啊
3q --------------------编程问答-------------------- 留个记号,有时间慢慢看 --------------------编程问答-------------------- mark..支持 --------------------编程问答-------------------- mark --------------------编程问答-------------------- 其实完全可以不用定义两个类,除了希尔排序没问题,其他的都有问题
冒泡:if(list[i]>list[i+1])
{
done=false;
temp=list[i];
list[i]=list[i+1];
list[i+1]=temp;
}
选择:
if (list[j] < list[min])
{
int t = list[min];
list[min] = list[j];
list[j] = t;
}
插入:
for(int i=1;i<list.Length;i++)
{
int t=list[i];
int j=i;
定义一个类,代码会简单很多. --------------------编程问答-------------------- 留个脚印
谢谢楼主分享 --------------------编程问答-------------------- 000 --------------------编程问答-------------------- mark下 --------------------编程问答-------------------- 二分的递归排序呢?那么重要一个,十家面试五家考的专用面试题都没。。。还全。。。太假了。。。 --------------------编程问答-------------------- 不錯,學習中 --------------------编程问答-------------------- 不错,值得学习 --------------------编程问答-------------------- 棒 --------------------编程问答-------------------- 谢谢楼主的分享 --------------------编程问答-------------------- MARK,收藏 --------------------编程问答-------------------- 顶了再看
--------------------编程问答-------------------- 不错,好象少了点中文注释了吧 呵呵 --------------------编程问答-------------------- 好,收了。 --------------------编程问答-------------------- mark --------------------编程问答-------------------- mark --------------------编程问答-------------------- mark --------------------编程问答-------------------- en... --------------------编程问答-------------------- mark --------------------编程问答-------------------- 谢谢分享…… --------------------编程问答-------------------- 很有用 --------------------编程问答-------------------- MARK来学习一下 --------------------编程问答-------------------- 我收藏了,谢谢 --------------------编程问答-------------------- up --------------------编程问答-------------------- [color=#00FF00][/color真好...谢谢楼主...收了... --------------------编程问答-------------------- 学习了 呵呵 真的不错 --------------------编程问答-------------------- hen hao --------------------编程问答-------------------- mark --------------------编程问答-------------------- ding ding ding --------------------编程问答-------------------- 我顶你,可是你得继续! --------------------编程问答-------------------- 留名字 呵呵 --------------------编程问答-------------------- 看了 --------------------编程问答-------------------- 收藏 --------------------编程问答-------------------- mark --------------------编程问答-------------------- 顶起来。。。。 --------------------编程问答-------------------- 学习 --------------------编程问答-------------------- 其实只需要一个快速排序就够了
选择、冒泡等都是教学用的 --------------------编程问答-------------------- 标记下 --------------------编程问答-------------------- 嫖得! --------------------编程问答-------------------- mark --------------------编程问答-------------------- 这贴收了 --------------------编程问答-------------------- 学习啦。。。。 --------------------编程问答-------------------- 厚道啊 --------------------编程问答-------------------- 分享了 --------------------编程问答-------------------- xiexie --------------------编程问答-------------------- lg --------------------编程问答-------------------- 这个不错嘛!要好好学了 --------------------编程问答-------------------- 不错,顶下。。。 --------------------编程问答-------------------- dingding --------------------编程问答-------------------- Mark --------------------编程问答-------------------- 收了 --------------------编程问答-------------------- 不错,有空看看 --------------------编程问答-------------------- 不错 ,,学习! --------------------编程问答-------------------- 不错,学习学习~~~ --------------------编程问答-------------------- 学习了~~~ --------------------编程问答-------------------- 顶一道~~ --------------------编程问答-------------------- 少了点 --------------------编程问答-------------------- mark+up --------------------编程问答-------------------- nice --------------------编程问答-------------------- 看看 --------------------编程问答-------------------- 谢谢,谢谢楼主的分分享!!! --------------------编程问答-------------------- 不错,值得学习 --------------------编程问答-------------------- 很有用啊!!! --------------------编程问答-------------------- 非常推荐! --------------------编程问答-------------------- 这也叫大全呀????排序算法多了去了 --------------------编程问答--------------------
顶这句话! --------------------编程问答-------------------- 不错不错。..... --------------------编程问答-------------------- 不错 顶 --------------------编程问答-------------------- 一、归并排序
public static void MergeSort(int[] arr, int start, int end) //递归
{
if (start < end)
{
int middle = (start + end) / 2;
MergeSort(arr,start,middle);
MergeSort(arr,middle+1,end);
MergeSort(arr,start,middle,end);
}
}
public static void MergeSort(int[] arr, int start, int middle, int end)
{
int[] tmp = new int[end - start + 1];
int i = start;
int j = middle + 1;
int k = 0;
while (i <= middle && j <= end)
{
if (arr[i] < arr[j])
{
tmp[k] = arr[i];
k++;
i++;
}
else
{
tmp[k] = arr[j];
k++;
j++;
}
}
while (i <= middle)
{
tmp[k] = arr[i];
k++;
i++;
}
while (j <= end)
{
tmp[k] = arr[j];
k++;
j++;
}
for (k = 0, i = start; i <= end; k++, i++)
arr[i] = tmp[k];
}
二、希尔排序
public static void ShellSort(int[] arr)
{
int gap = arr.Length / 2;
int tmp;
while (gap > 0)
{
for (int i = 0; i < arr.Length; i++)
{
tmp = arr[i];
int j;
for(j = i-gap;j >= 0 ;j-=gap)
{
if (arr[j] > tmp)
arr[j + gap] = arr[j];
else
break;
}
arr[j + gap] = tmp;
}
gap /= 2;
}
}
三、基数排序
public static void RadixSort(int[] arr)
{
int MaxLength = 1; //最大数的位数
int tmp,num,i,j;
List<int>[] list = new List<int>[10];
for (i = 0; i < 10;i++ )
list[i] = new List<int>();
for (i = 0; i < arr.Length; i++)
{
num = arr[i];
tmp = 0;
while (num != 0)
{
tmp++;
num /= 10;
}
if (tmp > MaxLength)
MaxLength = tmp;
}
for (i = 0; i < MaxLength; i++)
{
for (j = 0; j < arr.Length; j++)
{
num = arr[j];
tmp = i;
while (tmp > 0)
{
num /= 10;
tmp--;
}
tmp = num % 10; //第i+1位上的数
list[tmp].Add(arr[j]);
}
tmp = 0;
for (j = 0; j < 10; j++)
{
foreach (int k in list[j])
{
arr[tmp] = k;
tmp++;
}
list[j].Clear();
}
}
}
四、快速排序
static int Partition(int[] arr, int low, int high)
{
//进行一趟快速排序,返回中心轴记录位置
// arr[0] = arr[low];
int pivot = arr[low];//把中心轴置于arr[0]
while (low < high)
{
while (low < high && arr[high] >= pivot)
{
--high;
}
Swap(ref arr[high], ref arr[low]);//将比中心轴记录小的移到低端
while (low < high && arr[low] <= pivot)
{
++low;
}
Swap(ref arr[high], ref arr[low]);//将比中心轴记录大的移到高端
}
arr[low] = pivot; //中心轴移到正确位置
return low; //返回中心轴位置
}
static void Swap(ref int i, ref int j)
{
int t;
t = i;
i = j;
j = t;
}
static void QuickSort(int[] arr, int low, int high)
{
if (low < high )//当 arr[low,high]为空或只一个记录无需排序
{
int pivot = Partition(arr, low, high);
QuickSort(arr, low, pivot - 1);
QuickSort(arr, pivot + 1, high);
}
}
五、堆排序
public static void HeapSort(int[] arr)
{
BuildMaxHeap(arr);
for (int i = (arr.Length - 1); i > 0; i--)
{
Swap(ref arr[0], ref arr[i]); //将堆顶元素和无序区的最后一个元素交换
MaxHeaping(arr, 0, i); //将新的无序区调整为堆
}
}
/// <summary>
/// 初始化大根堆,由底向上建堆
/// 完全二叉树的基本性质,最底层节点是n/2,所以从arr.Length/2开始
/// </summary>
private static void BuildMaxHeap(int[] arr)
{
for (int i = (arr.Length / 2) - 1; i >= 0; i--)
{
MaxHeaping(arr, i, arr.Length);
}
}
/// <summary>
/// 将指定的节点调整为堆
/// </summary>
/// <param name="i">需要调整的节点</param>
/// <param name="heapSize">堆的大小,也指数组中无序区的长度</param>
private static void MaxHeaping(int[] arr, int i, int heapSize)
{
int left = 2 * i + 1; // 左子节点
int right = 2 * i + 2; // 右子节点
int large = i; // 临时变量,存放大的节点值
// 比较左子节点
if (left < heapSize && arr[left] > arr[large])
{
large = left;
}
// 比较右子节点
if (right < heapSize && arr[right] > arr[large])
{
large = right;
}
// 如有子节点大于自身就交换,使大的元素上移
if (i != large)
{
Swap(ref arr[i], ref arr[large]);
MaxHeaping(arr, large, heapSize);
}
}
private static void Swap(ref int a, ref int b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
--------------------编程问答-------------------- 学习了,支持 --------------------编程问答-------------------- xuexile ,学习了,谢谢分享! --------------------编程问答-------------------- xue xi --------------------编程问答-------------------- 谢谢哦、、
补充:.NET技术 , C#