程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 排序算法

排序算法

編輯:C++入門知識

冒泡排序,穩定,復雜度n*n

選擇排序,不穩定,復雜度n*n

不穩定:

快速排序,遞歸實現,不穩定,復雜度n*log(n),空間復雜度

堆排序,大小頂堆實現,不穩定,復雜度n*log(n)

穩定:

在快速排序中添加另外一個控制變量

合並排序,兩個有序隊列合並

 


1、快速排序示例


[cpp]
//快速排序示例  
#include <cstdio>  
#include <cstdlib>  
int p[50]; 
int len; 
void input() 

    len = 20; 
    int i; 
    for(i = 0; i < len; ++ i) 
        p[i] = rand() / 100; 
    p[0] = p[1] = p[2] = 50; 

 
void print() 

    int i; 
    for(i = 0; i < len; ++ i) 
        printf("%d ", p[i]); 
    printf("\n"); 

 
void fsort(int l, int r)//快速排序  

    if(l >= r)  
        return; 
    int temp = p[l]; 
    int pl, pr; 
    for(pl = l, pr = r;pl < pr;) 
    { 
        for(;pl < pr;) 
        { 
            if(p[pr] >= temp) 
                pr --; 
            else 
                break; 
        } 
        if(pl < pr) p[pl ++] = p[pr]; 
        for(;pl < pr;) 
        { 
            if(p[pl] <= temp) 
                pl ++; 
            else 
                break; 
        } 
        if(pl < pr) p[pr --] = p[pl]; 
    } 
    p[pr] = temp; 
    fsort(l, pr - 1); 
    fsort(pr + 1, r); 

 
int main() 

    input(); 
    print(); 
    fsort(0, len - 1); 
    print(); 
    return 0; 

//快速排序示例
#include <cstdio>
#include <cstdlib>
int p[50];
int len;
void input()
{
 len = 20;
 int i;
 for(i = 0; i < len; ++ i)
  p[i] = rand() / 100;
 p[0] = p[1] = p[2] = 50;
}

void print()
{
 int i;
 for(i = 0; i < len; ++ i)
  printf("%d ", p[i]);
 printf("\n");
}

void fsort(int l, int r)//快速排序
{
 if(l >= r)
  return;
 int temp = p[l];
 int pl, pr;
 for(pl = l, pr = r;pl < pr;)
 {
  for(;pl < pr;)
  {
   if(p[pr] >= temp)
    pr --;
   else
    break;
  }
  if(pl < pr) p[pl ++] = p[pr];
  for(;pl < pr;)
  {
   if(p[pl] <= temp)
    pl ++;
   else
    break;
  }
  if(pl < pr) p[pr --] = p[pl];
 }
 p[pr] = temp;
 fsort(l, pr - 1);
 fsort(pr + 1, r);
}

int main()
{
 input();
 print();
 fsort(0, len - 1);
 print();
 return 0;
}
2、堆排序示例


[cpp]
/堆排序示例  
#include <cstdio>  
#include <cstdlib>  
int p[50]; 
int len; 
void input() 

    len = 25; 
    int i; 
    for(i = 1; i <= len; ++ i) 
        p[i] = rand() / 100; 
    p[1] = p[2] = 50; 

 
void print() 

    int i; 
    for(i = 1; i <= len; ++ i) 
        printf("%d ", p[i]); 
    printf("\n"); 

 
void swap(int x, int y) 

    int temp = p[x]; 
    p[x] = p[y]; 
    p[y] = temp; 

 
void fsort()//堆排序  

    int i; 
    int q; 
    for(i = len / 2; i >= 1; -- i)//小頂堆初始化  
    { 
        q = i; 
        while(2 * q <= len) 
        { 
            if(2 * q + 1 > len) 
            { 
                if(p[q] > p[2 * q]) 
                { 
                    swap(q, 2 * q); 
                    q = 2 * q; 
                } 
                break; 
            } 
            else 
            { 
                if(p[2 * q] <= p[2 * q + 1]) 
                { 
                    if(p[q] > p[2 * q]) 
                    { 
                        swap(q, 2 * q); 
                        q = 2 * q; 
                    } 
                    else 
                        break; 
                } 
                else 
                { 
                    if(p[q] > p[2 * q + 1]) 
                    { 
                        swap(q, 2 * q + 1); 
                        q = 2 * q + 1; 
                    } 
                    else 
                        break; 
                } 
            } 
        } 
    } 
    int n = 1; 
    while(n < len)//每次第一個數與最後一位數交換,這樣循環len - 1遍,數組從大到小排序  
    { 
        swap(len - n + 1, 1); 
        q = 1; 
        while(2 * q < len - n + 1) 
        { 
            if(2 * q + 1 >= len - n + 1) 
            { 
                if(p[q] > p[2 * q]) 
                { 
                    swap(q, 2 * q); 
                    q = 2 * q; 
                } 
                else 
                    break; 
            } 
            else 
            { 
                if(p[2 * q] <= p[2 * q + 1]) 
                { 
                    if(p[q] > p[2 * q]) 
                    { 
                        swap(q, 2 * q); 
                        q = 2 * q; 
                    } 
                    else 
                        break; 
                } 
                else 
                { 
                    if(p[q] > p[2 * q + 1]) 
                    { 
                        swap(q, 2 * q + 1); 
                        q = 2 * q + 1; 
                    } 
                    else 
                        break; 
                } 
            } 
        } 
        n ++; 
    } 
 

 
int main() 

    input(); 
    print(); 
    fsort(); 
    print(); 
    return 0; 

//堆排序示例
#include <cstdio>
#include <cstdlib>
int p[50];
int len;
void input()
{
 len = 25;
 int i;
 for(i = 1; i <= len; ++ i)
  p[i] = rand() / 100;
 p[1] = p[2] = 50;
}

void print()
{
 int i;
 for(i = 1; i <= len; ++ i)
  printf("%d ", p[i]);
 printf("\n");
}

void swap(int x, int y)
{
 int temp = p[x];
 p[x] = p[y];
 p[y] = temp;
}

void fsort()//堆排序
{
 int i;
 int q;
 for(i = len / 2; i >= 1; -- i)//小頂堆初始化
 {
  q = i;
  while(2 * q <= len)
  {
   if(2 * q + 1 > len)
   {
    if(p[q] > p[2 * q])
    {
     swap(q, 2 * q);
     q = 2 * q;
    }
    break;
   }
   else
   {
    if(p[2 * q] <= p[2 * q + 1])
    {
     if(p[q] > p[2 * q])
     {
      swap(q, 2 * q);
      q = 2 * q;
     }
     else
      break;
    }
    else
    {
     if(p[q] > p[2 * q + 1])
     {
      swap(q, 2 * q + 1);
      q = 2 * q + 1;
     }
     else
      break;
    }
   }
  }
 }
 int n = 1;
 while(n < len)//每次第一個數與最後一位數交換,這樣循環len - 1遍,數組從大到小排序
 {
  swap(len - n + 1, 1);
  q = 1;
  while(2 * q < len - n + 1)
  {
   if(2 * q + 1 >= len - n + 1)
   {
    if(p[q] > p[2 * q])
    {
     swap(q, 2 * q);
     q = 2 * q;
    }
    else
     break;
   }
   else
   {
    if(p[2 * q] <= p[2 * q + 1])
    {
     if(p[q] > p[2 * q])
     {
      swap(q, 2 * q);
      q = 2 * q;
     }
     else
      break;
    }
    else
    {
     if(p[q] > p[2 * q + 1])
     {
      swap(q, 2 * q + 1);
      q = 2 * q + 1;
     }
     else
      break;
    }
   }
  }
  n ++;
 }

}

int main()
{
 input();
 print();
 fsort();
 print();
 return 0;
}

3、歸並排序


[cpp]
/歸並排序示例  
#include <cstdio>  
#include <cstdlib>  
#include <cstring>  
int p[50]; 
int _p[50]; 
int len; 
void input() 

    len = 20; 
    int i; 
    for(i = 0; i < len; ++ i) 
        _p[i] = p[i] = rand() / 100; 
    _p[0] = p[0] = 50; 
    _p[1] = p[1] = 50; 
    _p[2] = p[2] = 50; 

 
void print() 

    int i; 
    for(i = 0; i < len; ++ i) 
        printf("%d ", p[i]); 
    printf("\n"); 

 
void fsort(int l, int r)//歸並排序  

    if(l == r) 
        return; 
    int mid = (l + r) / 2; 
    fsort(l, mid); 
    fsort(mid + 1, r); 
    int i, j, z; 
    for(i = l, j = mid + 1, z = 0; i <= mid || j <= r;)//對兩個有序數組進行排序  
    { 
        if(i > mid) 
            _p[l + (z ++)] = p[j ++]; 
        else if(j > r) 
            _p[l + (z ++)] = p[i ++]; 
        else 
        { 
            if(p[i] <= p[j]) 
                _p[l + (z ++)] = p[i ++]; 
            else 
                _p[l + (z ++)] = p[j ++]; 
        } 
    } 
    //memcpy(p, _p, sizeof(_p));  
    for(i = l; i <= r; ++ i) 
        p[i] = _p[i]; 

 
int main() 

    input(); 
    print(); 
    fsort(0, len - 1); 
    print(); 
    return 0; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved