各种排序模板

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/AK_97_CT/article/details/87644237

1、冒泡排序

 void Bubble_Sort(vector<int> &vec)
 {
     for(int i = 0; i < vec.size() -1; i ++)
     {
         bool flag=false;
         for(int j = 0; j < vec.size() - i - 1; j ++)
         {
             if(vec[j] > vec[j + 1])
             {
                swap(vec[j],vec[j + 1]);
                flag=true;
             }
         }
         if(!flag) break;
     }
 }

2、选择排序

 void Seletion_Sort(vector<int> &vec)
{
    for(int i = 0; i < vec.size(); i ++)
    {
        for(int j = i + 1; j < vec.size(); j ++)
        {
            if(vec[i] > vec[j])
            {
               swap(vec[i],vec[j]);
            }
        }
    }
}

3、插入排序

  void Insertion_Sort(vector<int> &vec)
 {
     for(int i = 1; i < vec.size(); i ++)
     {
         int temp = vec[i],j;
         for(j = i - 1; j >= 0; j --)
         {
             if(temp < vec[j]) vec[j + 1]=vec[j];
             else break;
         }
         vec[j + 1] = temp;
     }
 }

4、归并排序

void Merge_Sort(vector<int> &vec,int l,int r)
{
  if(l >= r) return;
  int mid=(l + r) / 2;
  Merge_Sort(vec,l,mid);
  Merge_Sort(vec,mid + 1,r);

  static vector<int> t_vec;
  t_vec.clear();
  int i = l, j = mid + 1;
  while(i <= mid && j <= r) {
   if(vec[i] <= vec[j]) t_vec.push_back(vec[i ++ ]);
   else t_vec.push_back(vec[j ++ ]);
  }
  while(i <= mid) t_vec.push_back(vec[i ++ ]);
  while(j <= r) t_vec.push_back(vec[j ++ ]);
  for(i = l, j = 0; j < t_vec.size(); i ++,j ++) vec[i] = t_vec[j];
}

5、快速排序

  void Quick_Sort(vector<int> &vec, int l, int r)
 {
     if(l >= r) return;
     int i = l - 1, j = r + 1,x = vec[(l + r) / 2];
     while(i < j)
     {
         do i ++; while(vec[i] < x);
         do j --; while(vec[j] > x);
         if(i < j) swap(vec[i],vec[j]);
         else 
         {
         Quick_Sort(vec, l, j);
         Quick_Sort(vec, j + 1, r);
         }
     }
 }

6、希尔排序

 void Shell_Sort(vector& vec)
 {
     //掌握思想即可
 }

7、堆排序

 void push_down(vector<int> &heap, int size, int u)
 {
     int t = u, left = u * 2, right = u * 2 + 1;
     if(left <= size && heap[left] > heap[t]) t = left;
     if(right <= size && heap[right] > heap[t]) t = right;
     if(t != u)
     {
         swap(heap[t], heap[u]);
         push_down(heap, size, t);
     }
 }
 void push_up(vector<int> &heap, int u)
 {
     while(u / 2 &&heap[u / 2] < heap[u])
     {
         swap(heap[u / 2], heap[u]);
         u /= 2;
     }
 }
 /*
 void insert(vector<int> &heap, int size, int x)
    {
     heap[ ++ size] = x;
     push_up(heap, size, x);
}
void remove_top(vector<int> &heap, int &size)
{
    heap[1] = heap[size];
    size --;
    push_down(heap, size, 1);
}
*/
  void Heap_Sort(vector<int> &q, int n)
  {
      int size = n;
      for(int i = 1; i <= n; i ++) push_up(q, i);
      for(int i = 1; i <= n; i ++)
      {
           swap(q[1], q[size]);
           size --;
           push_down(q, size, 1);
      }
  }

8、计数排序

void Counting_Sort(vector<int> &q, int n)
{
    vector<int> cnt(101, 0);
    for(int i = 1; i <= n; i ++) cnt[q[i]] ++;
    for(int i =1, k = 1; i <= 100; i ++)
    {
        while(cnt[i])
        {
            q[k ++] = i;
            cnt[i] --;
        }
    }
}

9、桶排序

void Bucket_Sort(vector<int> &q)
{
    //掌握思想即可
}

10、基数排序

int get(int x, int i)
{
    while(i -- ) x /= 10;
    return x % 10;
}
void Radix_Sort(vector<int> &q, int n)
{
    vector<vector<int> > cnt(10);

    for(int i = 0; i < 3; i ++)
    {
        for(int j = 0; j < 10; j ++) cnt[j].clear();

        for(int j = 1; j <= n; j ++)
          cnt[get(q[j],i)].push_back(q[j]);

        for(int j = 0, k = 1; j < 10; j ++)
        for(int x : cnt[j])
          q[k ++] = x;
    }
}
int main()
{
  vector<int> vec;
  int n;
  cin>>n;
  vec.resize(n+1);
  for(int i = 1; i <= n; i ++) cin>>vec[i];
  // Merge_Sort(vec,0,vec.size()-1);
  // Bubble_Sort(vec);
  // Seletion_Sort(vec);
  // Insertion_Sort(vec);
  // Quick_Sort(vec,0,vec.size()-1);
  // Heap_Sort(vec,n);  //索引从1开始
  // Counting_Sort(vec,n);
  Radix_Sort(vec,n);
  for(int i = 1;i <= n;i++) cout<<vec[i]<<endl;
  return 0;
}

猜你喜欢

转载自blog.csdn.net/AK_97_CT/article/details/87644237
今日推荐