当前位置:编程学习 > C#/ASP.NET >>

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();
}
}

--------------------编程问答-------------------- 嗯,不错 --------------------编程问答-------------------- 不错的东西,留个脚印。 --------------------编程问答--------------------
引用 1 楼 changjiangzhibin 的回复:
嗯,不错
--------------------编程问答-------------------- 顶顶 --------------------编程问答-------------------- 谢谢楼主分享 --------------------编程问答-------------------- 谢谢楼主!
收了,有空看看! --------------------编程问答-------------------- 这个好,收拉,谢谢 --------------------编程问答-------------------- 真的不错啊,呵呵,还要连载哦 --------------------编程问答-------------------- 收藏 --------------------编程问答-------------------- 我收藏了,谢谢 --------------------编程问答-------------------- 快速排序
二分排序
堆排序
...
大全? --------------------编程问答-------------------- 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 --------------------编程问答-------------------- 看看 --------------------编程问答--------------------     谢谢,谢谢楼主的分分享!!! --------------------编程问答-------------------- 不错,值得学习 --------------------编程问答-------------------- 很有用啊!!! --------------------编程问答-------------------- 非常推荐! --------------------编程问答-------------------- 这也叫大全呀????排序算法多了去了 --------------------编程问答--------------------
引用楼主 yinhuashui 的回复:
转来的,没有实际跑过

顶这句话! --------------------编程问答-------------------- 不错不错。..... --------------------编程问答-------------------- 不错   顶 --------------------编程问答-------------------- 一、归并排序

       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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,