zoukankan      html  css  js  c++  java
  • 各种内部排序算法,C#实现

         1、首先是插入排序,插入排序也有很多种,比如直接插入排序,二分插入排序等。但原理都基本差不多:在一个已经排好序的数列中插入新的信息。这样依次插入之后,整个数列就是一个有序的数列了。

     

    插入排序
    //插入排序

    publicstaticint[] insertSort(int[] array)
    {
    for (int i =1; i < array.Length; i++) //遍历需要排序的数组
    {
    int j =0;
    while (j < i && array[j] < array[i]) //找到满足条件的待插入数
    {
    j
    ++;
    }

    int temp = array[i]; //保存待插入的数
    int Last = i;

    while (Last > j) //数组往后移动
    {
    array[Last]
    = array[Last -1];
    Last
    --;
    }
    array[j]
    = temp; //把需要插入的数,插入到第j个位置
    }
    return array;
    }
    //插入排序

    publicstaticint[] insertSort(int[] array)
    {
    for (int i =1; i < array.Length; i++) //遍历需要排序的数组
    {
    int j =0;
    while (j < i && array[j] < array[i]) //找到满足条件的待插入数
    {
    j
    ++;
    }

    int temp = array[i]; //保存待插入的数
    int Last = i;

    while (Last > j) //数组往后移动
    {
    array[Last]
    = array[Last -1];
    Last
    --;
    }
    array[j]
    = temp; //把需要插入的数,插入到第j个位置
    }
    return array;
    }

       

       2、冒泡排序,冒泡排序的基本原理是。比较旁边两个数字,(如果按升序排列)然后前面的数字比后面的数字大,则两个进行交换。

     

    冒泡排序 
    //冒泡排序
    publicstaticint[] bubbleSort(int[] array)
    {
    for (int j =1; j < array.Length; j++) //排N次序
    {
    for (int i =1; i < array.Length; i++) //遍历一遍,第一次排序
    {
    if (array[i] < array[i -1]) //如果前面的比后面的大,则两者进行交换
    {
    int temp = array[i];
    array[i]
    = array[i -1];
    array[i
    -1] = temp;
    }
    }
    }
    return array;
    }

       

       3、希尔排序,方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行冒泡排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。

     

    希尔排序 
    //希尔排序
    publicstaticint[] shellSort(int[] array)
    {
    ArrayList list
    = getDalt(array);
    Int32[] dalt
    = (Int32[])list.ToArray(typeof(Int32)); //转换为数组
    for (int i =0; i <dalt.Length; i++)
    {
    array
    = shellAdjust(array,dalt[i]);
    }
    return array;
    }
    //获得dalt数组,保存比较的增量表
    publicstatic ArrayList getDalt(int[] array) {
    ArrayList dalt
    =new ArrayList();
    int i = (array.Length+1) /2;
    while (i >1)
    {
    dalt.Add(i);
    i
    =(i+1)/2;
    }
    dalt.Add(i);
    return dalt;
    }
    //一趟排序
    publicstaticint[] shellAdjust(int[] array, int add) //进行排序
    {
    int i=0;
    while (i + add < array.Length)
    {
    if (array[i] > array[i + add]) //如果前面的比后面的大,则交换
    {
    int temp = array[i + add];
    array[i
    +add]=array[i];
    array[i]
    = temp;
    }
    i
    ++;
    }
    return array;
    }

     

        4、快速排序。快速排序是对冒泡排序的一种改进。主要是通过把整个数列分成若干个小的数列再排序。 首先随便在数组中找到一个目标数,然后移动数组中的元素,使大于改数的移动右边,小于的则移动左边。这样就分成了两部分,一部分比该数大,一部分比该数小。然后通过递归的方式。进行全部排列。

       快速排序算法,最核心的就是中间的划分过程。但是上次这个过程并不能正确的划分出来。特此改正,造成误解,一并道歉。特此订正。

       

     1 public static int paration(Integer[] arrayList,int begin,int end){
     2         int temp=arrayList[begin];
     3         while (begin<end) {
     4             while (begin<end&&arrayList[end]>temp) {
     5                 end--;
     6             }
     7             if (begin<end) {
     8                 arrayList[begin]=arrayList[end];
     9                 begin++;
    10             }
    11             while (begin<end&&arrayList[begin]<temp) {
    12                 begin++;
    13             }
    14             if (begin<end) {
    15                 arrayList[end]=arrayList[begin];
    16                 end--;
    17             }
    18         }
    19         arrayList[begin]=temp;
    20         return begin;
    21     }
    22     public static void quickSort(Integer[] arrayList,int begin,int end){
    23         if(begin>=end)
    24             return;
    25         int par=paration(arrayList, begin, end);
    26         if(begin<par-1)
    27             quickSort(arrayList, begin, par-1);
    28         if (par+1<end) 
    29             quickSort(arrayList, par+1, end);
    30         
    31     }

        5、堆排序。堆排序首先需要建立一个堆。可以是大堆(父结点比子结点的元素都要大),也可以是小堆(父节点比子结点都要小);本例建成大堆。

     

    堆排序
    //堆排序
    publicstaticint[] heapSort(int[] array)
    {
    for (int i = (array.Length-1)/2; i>=0;i--)
    {
    //首先整个序列进行堆调整,
    heapAdjust(array,i, array.Length);
    }
    for (int i = array.Length-1; i >=0; i--)
    {
    //交换第一个和最后一个数据,形成排序
    int temp=array[0];
    array[
    0]=array[i];
    array[i]
    = temp;
    //堆重新调整
    heapAdjust(array,0,i-1);
    }
    return array;
    }

     

    堆调整
    ///<summary>
    /// 堆调整,建成一个大堆
    ///</summary>
    ///<param name="array"></param>
    ///<param name="i">开始调整</param>
    ///<param name="n">调整的长度</param>
    ///<returns>返回调整后的数组</returns>
    publicstaticint[] heapAdjust(int[] array,int j,int n)
    {
    int temp = array[j]; //此次需要调整的数
    for (int i = j*2+1; i < n; i=2*j+1)
    {
    if (i+1<n&&array[i] < array[i +1])
    i
    ++;
    if (temp <array[i]) //如果孩子的结点更大,则交换
    {
    array[j]
    = array[i];
    j
    = i;
    }
    else
    break;
    }
    array[j]
    = temp; //需要调整的结点保存在适当位置
    putOutArray(array);
    return array;
    }

      附录1:输出数组

     

    输出数组
    //输出数组
    publicstaticvoid putOutArray(int[] array)
    {
    for (int i =0; i < array.Length; i++)
    {
    Console.Write(array[i]
    +"");
    }
    Console.Write(
    "\n");
    }

      附录2:测试数组

     

    测试
    staticvoid Main(string[] args)
    {
    int[] array = { 72, 45, 3, 64, 78, 12, 56, 76, 23, 46 };
    Console.WriteLine(
    "这是插入排序的结果");
    putOutArray(insertSort(array));
    Console.WriteLine(
    "这是冒泡排序的结果");
    putOutArray(bubbleSort(array));
    Console.WriteLine(
    "这是希尔排序的结果:");
    putOutArray(shellSort(array));
    Console.WriteLine(
    "这是快速排序:");
    putOutArray(quickSort(array,
    0,array.Length-1));
    }
    //快速排序
    publicstaticint[] quickSort(int[] array,int low,int high)
    {
    int at;
    if (low < high)
    {
    array
    = quick(array, low, high, out at); //把数组分成两个部分,
    quickSort(array,low,at-1); //左边的排序
    quickSort(array,at,high); //右边的排序
    }
    return array;
    }
    publicstaticint[] quick(int[] array, int first, int end,outint at) {
    int mid = array[first]; //同第一个数比较
    while (first <= end)
    {
    while (array[first] < mid) //向右移动,直到找到比mid大或相等的那个数
    first++;
    while (array[end] > mid) //向左移动,直到找到比Mid小的那个数
    end--;
    if (first <= end)
    {
    int temp = array[first]; //交换两个数
    array[first] = array[end];
    array[end]
    = temp;
    first
    ++;
    end
    --;
    }
    }
    at
    = first;
    return array;
    }

     

         版权所有,欢迎转载,但是转载请注明出处:潇一

  • 相关阅读:
    URAL——DFS找规律——Nudnik Photographer
    URAL1353——DP——Milliard Vasya's Function
    URAL1203——DPor贪心——Scientific Conference
    递推DP HDOJ 5389 Zero Escape
    区间DP UVA 1351 String Compression
    树形DP UVA 1292 Strategic game
    Manacher HDOJ 5371 Hotaru's problem
    同余模定理 HDOJ 5373 The shortest problem
    递推DP HDOJ 5375 Gray code
    最大子序列和 HDOJ 1003 Max Sum
  • 原文地址:https://www.cnblogs.com/xiaoyi115/p/2047017.html
Copyright © 2011-2022 走看看