zoukankan      html  css  js  c++  java
  • C# 递归式快速排序算法

      1 static void Main(string[] args)
      2         {
      3 
      4             Console.WriteLine("************快速排序*****************");
      5             int[] list = new int[] { 4, 7, 6, 5, 3, 2, 8, 1 };
      6             QuickSort qs = new QuickSort();
      7             qs.quikSort(list, 0, list.Length - 1);
      8             for (int i = 0; i < list.Length; i++)
      9             {
     10                 Console.WriteLine("第{0}位是{1}", i + 1, list[i]);
     11             }
     12             // Console.WriteLine(list);
     13 
     14             Console.ReadKey();
     15         } 68 
     69 
     70     //递归快速排序法
     71     public class QuickSort
     72     {
     73         //快速排序
     74         public  void quikSort(int[] arr, int startIndex, int endIndex)
     75         {
     76             //递归结束条件  startIndex>endIndex
     77             if (startIndex >= endIndex)
     78             {
     79                 return;
     80             }
     81 
     82             //得到基准元素的位置
     83             int pivotIndex = partiton(arr, startIndex, endIndex);
     84 
     85             //根据基准元素,分成两部分递归排序
     86             quikSort(arr, startIndex, pivotIndex - 1);
     87             quikSort(arr, pivotIndex + 1, endIndex);
     88         }
     89 
    //指针交换法 90 private static int partiton(int[] arr, int startIndex, int endIndex) 91 { 92 //取第一个位置的元素作为基准元素 93 int pivot = arr[startIndex]; 94 int left = startIndex; 95 int right = endIndex; 96 97 while (left != right) 98 { 99 //控制right指针比较并左移 100 while (left < right && arr[right] > pivot) 101 { 102 right--; 103 } 104 105 //控制right指针比较并右移 106 while (left < right && arr[left] <= pivot) 107 { 108 left++; 109 } 110 111 //交换left和right指向的元素 112 if (left < right) 113 { 114 int p = arr[left]; 115 arr[left] = arr[right]; 116 arr[right] = p; 117 } 118 } 119 120 //pivoe和指针重合点交换 121 int s = arr[left]; 122 arr[left] = arr[startIndex]; 123 arr[startIndex] = s; 124 125 return left; 126 } 127
    //挖坑法
            private static int partiton1(int[] arr, int startIndex, int endIndex)
            {
                // 4, 7, 6, 5, 3, 2, 8, 1 
                //获取第一个位置的元素作为基准元素
                int pivot = arr[startIndex];  //4
                int left =startIndex;   //0
                int right = endIndex;   //7
    
                //坑的位置,初始等于pivot的位置
                int index = startIndex;  //0
    
                //大循环在左右指针重合或交错时结束
                while (right >= left)
                {
                    //right指针从右向左进行比较
                    while (right >= left)
                    {
                        int a = arr[right];
                        if (arr[right] < pivot)
                        {
                            int s = arr[right];
                            int t = arr[left];
    
                            arr[left] = arr[right];
                            index = right;
                            left++;
                            break;
                        }
                        right--;
                    }
    
                    //left指针从左向右进行比较
                    while (right > left)
                    {
                        if (arr[left] >= pivot)
                        {
                            int a = arr[right];
                            int b = arr[left];
    
                            arr[right] = arr[left];
                            index = left;
                            right--;
                            break;
                        }
                        left++;
    
                    }
                }
    
                arr[index] = pivot;
                return index;
            }
    128     }
  • 相关阅读:
    Delphi数据库处理
    delphi 递归的方法
    C#中StringBuilder用法以及和String的区别
    算法导论12.2节习题解答
    算法导论9.11习题解答(二叉树)
    算法导论10.15习题解答(deque实现源码)
    算法导论9.39习题解答(寻找中位数)
    算法导论84习题解答
    算法导论10.17习题解答(用两个队列实现一个栈)
    算法导论10.27习题解答(单链表逆转)
  • 原文地址:https://www.cnblogs.com/pushYYL/p/9921793.html
Copyright © 2011-2022 走看看