排序总结

来源:互联网 发布:书生商友seo 编辑:程序博客网 时间:2024/06/06 12:35


int mao()     //冒泡    从大到小
{
 int t;
 for ( int i = 0; i <= n-1; ++i)
  for ( int j = 0; j <= n-2; ++j)
   if (a[j] < a[j+1])
   {
    t = a[j];
    a[j] = a[j+1];
    a[j+1] = t;
   };
}

//冒泡
//每次冒出来剩下的里面最大或最小的


#include <iostream>


int quicksort(int left, int right)          //快排
{
 int i = left, j = right, mid,t;
 if (left > right) return 0;
 mid = a[left];
 while (i < j)
 {
  while (a[j] > mid) j--;
  while (a[i] < mid) i++;
  if (i < j)
  {
   t = a[i];
   a[i] = a[j];
   a[j] = t;
  }
 }
 a[left] = a [i];
 a[i] = mid;
 quicksort( left, i-1);
 quicksort( j+1, right);
 return 0;
};
//系统内置函数
#include <algorithm>
sort(first,last) //默认从小到大
sort(first,last,cmp)//cmp为自定义bool函数
//找到一个key,使得key两边的一边全比他大,另一边全比他小,再分别递归他两边




归并(求数列的逆序数)

先分再合;分到只有两个数,比较大小,然后再和旁边的一组比较,小的先放入数组,大的再放,以此类推




选择

每回选出剩下的最大(或最小)的数

int cnt = 0;  //交换的次数
for (int i = 0; i <= n-2; ++i)
{
 int minj = i;
 for (int j = i; j <= n-1; ++j)
 {
  if (a[j] < a[minj])
  {
   minj = j;
  }
 }
 int t = a[i];
 a[i] = a[minj];
 a[minj] = t;
 if ( i != minj)
 {
  ++cnt;
 }
}


插入

前面的数都是有序的,每个新加入的数找到自己的位置插入。

插入排序的优势在于处理相对有序的数列。

int v;
for (int i = 0; i <= n; ++i)
{
 v = a[i];
 int j = i-1;
 while ( j >= 0 && a[j] > v)
 {
  a[j+1] = a[j];
  --j;
 }
 a[j+1] = v;
 } ;


桶排

弄一个大数组,输入I,则a[I]++;


堆排



按位比