zoukankan      html  css  js  c++  java
  • 8种经典排序算法

    1.冒泡排序(Bubble sort)
    基本的

    View Code
    1 void BubbleSort(int A[],int n)
    2 {
    3  int i,j;
    4  for(i=1;i<n;i++) //最多做n-1趟排序
    5    for(j=n-1;j>=i;j--) //从后往前冒泡,最"轻"的冒泡到最前面 
    6     if(A[j]<A[j-1])
    7       swap(A[j],A[j-1]);
    8 }

    改进的

    View Code
     1 void BubbleSort_O(int A[],int n)
     2 {
     3  int i,j;
     4  for(i=1;i<n;i++){ //最多做n-1趟排序
     5    bool exchange=false; //交换标志
     6    for(j=n-1;j>=i;j--) //从后往前冒泡,最"轻"的冒泡到最前面 
     7     if(A[j]<A[j-1]){
     8       swap(A[j],A[j-1]);
     9       exchange=true;
    10      }
    11    if(!exchange) //本趟排序未发生交换,提前终止算法
    12       break;
    13  }
    14 }

    2.选择排序Selection sort

    View Code
     1 void SelectionSort(int A[],int n)
     2 {
     3  int i,j;
     4  for(i=0;i<n-1;i++){
     5    int min_index=i;
     6    for(j=i+1;j<n;j++)
     7       if(A[j]<A[min_index])
     8          min_index=j;
     9    if(min_index!=i)
    10       swap(A[i],A[min_index]);
    11  }
    12 }

    3.插入排序Insertion sort

    View Code
     1 void InsertSort(int A[], int n)
     2 {
     3     int i,j;
     4     for(i=1;i<n;i++) //依次插入R[1],…,R[n-1]
     5       if(A[i]<A[i-1]){
     6         int insert_value=A[i];
     7         j=i-1;
     8         do { //从右向左在有序区R[0..i-1]中查找A[i]的插入位置
     9             A[j+1]=A[j]; //将关键字大于A[i]的记录后移
    10             j--;
    11         }while(j>=0 && A[j]>insert_value); //当A[j]<=A[i]时终止
    12         A[j+1]=insert_value; //A[i]插入到正确的位置上
    13       }
    14 }

    4.希尔排序Shell sort

    View Code
     1 void ShellInsert(int A[],int n,int d)
     2 {//希尔排序中的一趟排序,d为当前增量
     3  int i,j;
     4  for(i=d;i<n;i++) //将R[d..n-1]分别插入各组当前的有序区
     5    if(A[i]<A[i-d]){
     6      int insert_value=A[i];
     7      j=i-d; 
     8      do {//查找A[i]的插入位置
     9         A[j+d]=A[j]; //后移记录
    10         j=j-d; //查找前一记录
    11      }while(j>=0 && A[j]>insert_value);
    12      A[j+d]=insert_value; //插入A[i]到正确的位置上
    13    } //endif
    14 } //ShellPass
    15 
    16 void  ShellSort(int A[],int n)
    17 {
    18     int increment=n/2+(n/2%2?0:1); //增量初值,这里初始化为一个靠近n的一半的奇数 
    19     while(increment>0){
    20         ShellInsert(A,n,increment); //一趟增量为increment的Shell插入排序
    21         increment-=2; //求下一增量
    22     }
    23 }

    5.快速排序Quick sort

    View Code
     1 int Partition(int A[],int i,int j)
     2 {
     3     int pivot=A[i];//中轴 
     4     while(i<j){
     5         //把右半边小于中轴的记录移到左半边 
     6         while(i<j && A[j]>=pivot) j--;
     7         if(i<j) A[i++]=A[j];
     8         //把左半边大于中轴的记录移到右半边 
     9         while(i<j && A[i]<=pivot) i++;
    10         if(i<j) A[j--]=A[i];
    11     }
    12     A[i]=pivot;
    13     return i;
    14 }
    15 
    16 void QuickSort(int A[],int low,int high)
    17 {
    18      if(low>=high) return;
    19      int pivotpos=Partition(A,low,high);
    20      QuickSort(A,low,pivotpos-1);
    21      QuickSort(A,pivotpos+1,high);
    22 }

    6.堆排序Heap sort

    View Code
     1 void Heapify(int A[], int i, int HeapSize)
     2 {
     3     int left = LEFT(i);
     4     int right = RIGHT(i);
     5     int largest=i;
     6 
     7     if (left<=HeapSize && A[largest]<A[left])
     8         largest = left;
     9 
    10     if (right<=HeapSize && A[largest]<A[right])
    11         largest = right;
    12 
    13     if (largest!=i)
    14     {
    15         swap(A[largest], A[i]);
    16         Heapify(A, largest, HeapSize); //调整后可能仍然违反堆性质(ps.也可以用非递归的方式)
    17     }
    18 }
    19 
    20 void BuildHeap(int A[], int n)
    21 {
    22     for(int i=PARENT(n);i>=0;i--)//从最后一个非叶节点开始,往前逐个调整到根节点 
    23         Heapify(A, i, n);
    24 }
    25 
    26 void HeapSort(int A[], int n)
    27 {
    28     BuildHeap(A,n);
    29     for (int i=n-1;i>0;i--)
    30     {
    31         swap(A[0], A[i]);
    32         Heapify(A,0,i-1);
    33     }
    34 }

    7.归并排序Merge sort

    View Code
     1 void Merge(int a[], int b[], int low, int mid, int high)
     2 {
     3     int k = low;
     4     int begin1 = low;
     5     int end1 = mid;
     6     int begin2 = mid + 1;
     7     int end2 = high;
     8     while(k <= high )
     9     {
    10         if(begin1 > end1)
    11             b[k++] = a[begin2++];
    12         else if(begin2 > end2)
    13             b[k++] = a[begin1++];
    14         else
    15         {
    16             if(a[begin1] <= a[begin2])
    17                 b[k++] = a[begin1++];
    18             else
    19                 b[k++] = a[begin2++];
    20         }
    21     } 
    22 }
    23 
    24 void MergePass(int a[], int b[], int seg, int size)
    25 {
    26     int seg_start_ind = 0;
    27     while(seg_start_ind + 2 * seg <= size) //#size - 2 * seg的意思是滿足可兩兩歸併的最低臨界值
    28     {
    29         Merge(a, b, seg_start_ind, seg_start_ind + seg - 1, seg_start_ind + seg * 2 - 1);
    30         seg_start_ind += 2 * seg;
    31     }
    32     //如果一段是正好可歸併的數量而另一段則少於正好可歸併的數量
    33     if(seg_start_ind + seg < size)
    34         Merge(a, b, seg_start_ind, seg_start_ind + seg - 1, size - 1);
    35     else
    36         for(int j = seg_start_ind; j < size; j++) //如果只剩下一段或者更少的數量
    37             b[j] = a[j];
    38 }
    39  
    40 void MergeSort(int a[], int size)
    41 {
    42     int* temp = new int[size];
    43     int seg = 1;
    44     while(seg < size)
    45     {
    46         MergePass(a, temp, seg, size);
    47         seg = seg*2;
    48         MergePass(temp, a, seg, size);
    49         seg = seg*2;
    50     }
    51     delete[] temp;
    52 }

    8.基数排序Radix sort

    View Code
     1 #include<iostream>
     2 #include<vector>
     3 #include<iterator>
     4 #include<algorithm>
     5  
     6 typedef std::vector<unsigned int> input_type;
     7  
     8 void radix_sort(input_type & x)
     9 {
    10     if ( x.empty() ) return; // at least one element
    11  
    12     typedef std::vector< std::vector< input_type::value_type > > buckets_type;
    13     buckets_type buckets(10); // allocate buckets
    14     // for sorting decimal numbers
    15  
    16     int pow10 = 1; // pow10 holds powers of 10 (1, 10, 100, ...)
    17  
    18     // find maximum in the array to limit the main loop below
    19     input_type::value_type max = *std::max_element(x.begin(), x.end());
    20  
    21     //begin radix sort
    22     for(; max != 0 ; max/=10, pow10*=10)
    23     {
    24         // 1. determine which bucket each element should enter
    25         // for each element in 'x':
    26         for(input_type::const_iterator elem = x.begin(); elem != x.end(); ++elem)
    27         {
    28                 // calculate the bucket number:
    29                 size_t const bucket_num = ( *elem / pow10 ) % 10;
    30                 // add the element to the list in the bucket:
    31                 buckets[ bucket_num ].push_back( *elem );
    32         }
    33  
    34         // 2. transfer results of buckets back into main array
    35         input_type::iterator store_pos = x.begin();
    36         // for each bucket:
    37         for(buckets_type::iterator bucket = buckets.begin(); bucket != buckets.end(); ++bucket)
    38         {
    39                 // for each element in the bucket:
    40                 for(buckets_type::value_type::const_iterator bucket_elem = bucket->begin();
    41                         bucket_elem != bucket->end(); ++bucket_elem)
    42                 {
    43                         // copy the element into next position in the main array
    44                         *store_pos++ = *bucket_elem;
    45                 }
    46                 bucket->clear(); // forget the current bucket's list
    47         }
    48     }
    49 }
    50  
    51 int main(){
    52  
    53     input_type input;
    54  
    55     // read numbers from standard input (ends with end-of-file: ^Z / ^D, or
    56     // with a new line that contains something that's not a number)
    57     std::cout << "Enter positive numbers to sort:" << std::endl;
    58     std::copy(std::istream_iterator<unsigned int>(std::cin),
    59         std::istream_iterator<unsigned int>(), std::back_inserter(input));
    60  
    61     if ( input.end() != std::find(input.begin(), input.end(), 0) )
    62     {
    63         std::cerr << "Zero isn't positive" << std::endl;
    64         return 1;
    65     }
    66  
    67     std::cout << " ** Elements before sorting: " << std::endl;
    68     std::copy(input.begin(), input.end(),
    69         std::ostream_iterator<unsigned int>(std::cout, " "));
    70  
    71     radix_sort(input);
    72  
    73     std::cout << std::endl << " ** Elements after sorting: " << std::endl;
    74     std::copy(input.begin(), input.end(),
    75         std::ostream_iterator<unsigned int>(std::cout, " "));
    76     std::cout << std::endl;
    77  
    78     return 0;
    79 }

    经典排序算法的复杂度
    参考:http://student.zjzk.cn/course_ware/data_structure/web/paixu/paixu8.3.2.4.htm
    http://www.cnblogs.com/kkun/archive/2011/11/23/2260312.html
    http://blog.csdn.net/deutschester/article/details/5946299

  • 相关阅读:
    阿里云CentOS安装firefox闪退
    error: QApplication: No such file or directory
    CentOS下自动登陆root帐户
    Linux下常用软件
    【记录】haphost免费vps初始配置
    检测Linux VPS是Xen、OpenVZ还是KVM真假方法
    使用VNC远程管理VPS(Centos系统)
    配置suricata
    NGUI的输入框制作(attach- input filed script的使用)
    NGUI技能CD效果制作(sprite的type:filled)
  • 原文地址:https://www.cnblogs.com/emituofo/p/2775846.html
Copyright © 2011-2022 走看看