现在的位置: 首页 > 综合 > 正文

排序的

2012年02月12日 ⁄ 综合 ⁄ 共 1620字 ⁄ 字号 评论关闭

排序的学习要点:
w1、排序的定义,排序可以看作是线性表的一种操作
w2、排序的分类,稳定排序与不稳定排序的定义。
w3、插入排序(直接插入、对分插入、二路插入、表插入、希尔插入排序)。
w4、交换排序(冒泡排序、快速排序)。
w5、选择排序(简单选择排序、树形选择排序、堆排序)。
w6、归并排序、基数排序。
w7、外部排序

w重点难点
w1、各种排序所基于的基本思想。
w2、排序性能的分析,是否是稳定排序。
w3、折半插入、希尔排序。
w4、快速排序。
w5、堆排序。
w6、败者树、置换选择排序、最佳归并树。

实现下面的算法:

冒泡排序法 :适用部分有序.思路(思路是:先用n个元素,元素0与元素1比较,将比较大的元素移动到元素1的位置,然后将元素1与元素2比较,*将比较大的元素移动到元素2的位置,一直移动,最大的元素将移动到元素n-1的位置.然后使用n-1个元素比较(因为已经有一个最大的元素找到了,现在要找次大的),找到最大的一个,移动到元素n-2的位置。(因此最多有n-1次冒泡)*还存在一个问题就是,在数组元素已经完成了排序的时候,需要终止排序,就是说,在一个循环比较的过程中,如果发现*有一次比较并不需要移动任何元素的话,说明排序已经完成,就不需要进行排序了)

选择排序法 : 选择排序是在待排序的表(n个记录)中用某种方法选出关键码最大(或最小)的记录,然后再从其余的n-1个记录中选出关键码最大(或最小)的记录,......直至选出n个记录。这里讨论两种选择排序方法--直接选择排序和堆排序。
一、直接选择排序 设待排序的表的n个记录用数组R表示,先定义一个从R[l],R[l+1],...,R[h]中的选出关键码最大的记录的函数maxkey,它输出该记录在数组中的位置。 直接选择方法是不稳定的。
二、堆排序 堆排序算法是不稳定的。

快速排序法  

计数排序法

一:冒泡

//冒泡排序程序

#include <iostream>
using namespace std;

//一次冒泡排序程序
//排序完成,返回是否需要再次排序的指示器
template<class T> bool Bubbe(T a[],int n);

//调用上一个程序,实现n-1次的冒泡
template<class T> void BubbeSort(T a[],int n);

//交换
template<class T>
int Swap(T a,T b) //如果前大后小,进行交换
{
 T c;
 if(a>b)
 {
  c=a;
  a=b;
  b=c;
 }
 return 1;
}

//以下是函数的实现
//一次冒泡排序程序
//排序完成,返回是否需要再次排序的指示器
template<class T>
bool Bubbe(T a[],int n)
{
 bool swapped=false;
 //是否继续排序的指示器
 //从第一个到第n个元素进行冒泡交换,注意这里的n并不一定是数组的长度n
 //每次调用这个函数的时候,n就会减去1
 for(int i=0;i<n-1;i++)
 {
  if(a[i]>a[i+1])
  {
  Swap(a[i],a[i+1]); //如果前大后小,进行交换
  swapped=true; //交换后,指示器设置为需要重排
  }
 }
 return swapped;
}

//调用上一个程序,实现n-1次的冒泡
template<class T>
void BubbeSort(T a[],int n)
{
//n-1次调用上一个程序,或者直到指示器说明不需要重排为止
for(int i=n;i>1 && Bubbe(a,i);i--);
}

//测试程序
void main()
{
int a[4];
a[0]=4;
a[1]=3;
a[2]=2;
a[3]=1;

for(int j=0;j<4;j++)
cout<<a[j]<<" ";
cout<<endl;

BubbeSort(a,4);

for(int i=0;i<4;i++)
cout<<a[i]<<" ";
cout<<endl;}

二:选择

 

 

抱歉!评论已关闭.