排序

1.选择排序

0-n-1选择最小的放到a[0];

1-n-1选择最小的放到a[1];

.......

2.插入排序

第一个有序,第二个跟其比较,小的话交换;

第三个跟第二个比较,小的话交换,再跟前一个比较。

3.sort函数

sort(a,a+N,cmp)

4.堆排序

4.1 堆定义:
  const int maxn=100;
  int heap[maxn],n=10;
4.2 向下调整:

  跟下一层比较,做调整。

void downAdjust(int low,int high)
{
  int i=low,j=i*2;
  while(j<=high)
  {
    if(j+1<=high&&heap[j+1]>heap[j])
    {
      j=j+1;
    }
    if(heap[j]>heap[i])
    {
      swap(heap[i],heap[j]);
      i=j;
      j=i*2;
     }else
    {
    break;
    }
  }
}

4.3 建堆

  从倒数第二层开始,由下至上,使得全局调整。

void createHeap()
{
  for(int i=n/2;i>=1;i--)
  {
    downAdjust(i,n);
  }
 }

4.4 删除堆顶元素(即最大数)

  void deleteTop()
{
  heap[1]=heap[n--];//把最小的数取代最大的数,并且使得元素个数减一;
  downAdjust(1,n);//做一次向下调整;
}

 

删除其他的元素也一样

heap[x]=heap[n--];

downAdjust(x,n);

4.5 添加一个元素

  4.5.1 向上调整:

    

void upAdjust(int low,int high)
{
  int i=high,j=high/2;
  while(j>=low)
  {
    if(heap[j]<heap[i])
    {
      swap(heap[i],heap[j]);
      i=j;
      j=i/2;
    }else
    {
      break;
    }
  }
}

  4.5.2 添加元素

void insert(int x)

{

  heap[++n]=x;//元素个数加一末位赋值

  upAdjust(1,n);//向上调整

}    

4.6 堆排序

把最大的数(第一个)跟最后一个交换,最大值放在了最后,1-n-1进行调整;

void heapsort()
{
  createHeap();
  for(int i=n;i>1;i--)
  {
    swap(heap[i],heap[1]);
    downAdjust(1,i-1);
  }
}

5.归并排序

简单方法:

void mergeSort(int A[])
{
  for(int step=2;step/2<=n;step*=2)//因为step<=n的话,可能没有经历全局排序(如step=8,全局n=10)
  {
    for(int i=1;i<=n;i+=step)
    {
      sort(A+i,A+min(i+step,n+1));//以防step太大
    }

    //一次排序完成。
  }
}

6.快速排序

void quicksort(int A[],int left,int right)

{
  if(left<right)//边界条件
  {
    int temp=A[left];//left处挖空
    int i=left,j=right;
    while(i<j)
    {
      while(i<j&&A[j]>temp)
      {
        j--;
      }
      A[i]=A[j];
      while(i<j&&A[i]<=temp)
      {
        i++;
      }
      A[j]=A[i];
    }
    A[i]=temp;
    quicksort(A,left,i-1);
    quicksort(A,i+1,right);
  }
}

 

 

posted @ 2017-08-29 20:08  renxuanwei  阅读(106)  评论(0)    收藏  举报