zoukankan      html  css  js  c++  java
  • 06、排序【应用篇】

    排序

    一、插入排序

    1、插入排序的算法

    void straightsort(seqlist r ,int n)
    { 
    	for(i=2;i<=n;i++)						//从第2个位置开始,把2~n的对象插入
    	{ 
    		r[0] = r[i]; 						//复制r[i]到r[0]为哨兵       		
    		j=i-1;    				
    		while(r[0].key<r[j].key) 			//待插入位置记录从后向前依次后移   		
    		{ 
    			r[j+1]=r[j];
    			j--;
    		} 
    		r[j+1]=r[0];						//插入到正确位置
    	} 
    }
    

    2、考点归纳

      1)折半插入排序和直接插入排序异同点

        不同点:折半插入排序元素比较次数少于直接插入排序

        相同点:折半插入排序的平均移动元素次数与直接插入排序一致

        注意:一个算法的时间复杂度,与所需要比较的关键字次数、需要移动的记录数量都有关,

      2)直接插入排序

        直接插入排序元素的移动和比较次数在最坏情况下可以达到n(n-1)/2,元素比较次数最少可以达到 n-1 次。

    3、插入类排序

      插入排序的原理:向有序序列中依次插入无序序列中待排序的记录,直到无序序 列为空,对应的有序序列即为排序的结果,其主旨是“插入”。已经参加排序的元素已经组成一个有序序列。

    二、冒泡排序

    1、冒泡排序的算法 

    void bubble(int r[n])
    {
    	for(i=0;i<=n-2; i++)
    	{
    		exchange=0; //标志位,
    		for(j=n-2; j>=i ;j--)
    		if (r[j+1]>r[j])
    		{
    			temp=r[j+1];
    			r[j+1]=r[j];
    			r[j]=temp;
    			exchange=1;
    		}
    		if (exchange==0) return; //某一轮排序没有发生交换,说明已经有序
    	}
    }
    

    2、交换类排序  

      交换排序的原理:先比较大小,如果逆序就进行交换,直到有序。其主旨是“若逆 序就交换”。一趟中可以在无序序列中找到最小或者最大的值

    三、简单选择排序

    1、简单选择排序算法

    void SelectSort(RecordType R[ ] , int length)
    {
    	n=length;
    	for ( i=1 ; i<= n-1 ; i++)          //共进行 n-1 趟排序
    	{
    		k=i ;                  //记录下最小元素位置
    		for ( j=i+1; j<=n ; j++ )      //在 R[i,…,n]中选择关键字最小的记录
    			if ( R[j].key < R[k].key )
    				k=j;
    			if (k!=i)           //与第 i 个记录交换
    			{
    				x=R[i] ;
    				R[i]=R[k] ;
    				R[k]=x;
    			}
    	}
    }

    采用单链表实现

    selectsort(struct node *head)
    {
    	p=head;
    	while(p!=NULL)
    	{
    		q=p;
    		r=p->next;
    		while(r!=NULL)
    		{
    			if(r->data < q->data) q=r;
    			r-r->next;
    		}
    	tmp = q->data;
    	q->data = p->data;
    	p->data = tmp;
    	p = p->next;
    	
    }

    2、考点归纳

      简单选择排序所需的比较次数为n(n-1)/2.

      简单选择排序移动次数最坏情况下可以达到3(n-1),最好情况下移动次数达到0.

    3、选择类排序

      选择排序的原理:从无序序列找关键字最小的记录,再放到已排好序的序列后面, 直到所有关键字全部有序,其主旨是“选择”。

    四、希尔排序

    1、对记录的关键字为{50 , 26 , 38 , 80 , 70 , 90 , 8 , 30 , 40 , 20 }进行排序,求出其排序过程

    2、插入类排序

      插入排序的原理:向有序序列中依次插入无序序列中待排序的记录,直到无序序 列为空,对应的有序序列即为排序的结果,其主旨是“插入”。已经参加排序的元素已经组成一个有序序列。

    五、快速排序

    1、快速排序的算法

    void qksort(int a[], int L, int H)
    {
    	int i, j, x;
    	if(L > H)
    	return ;					//输入不合法
    	i = L;
    	j = H;
    	x = a[i];					//将当前表中的第一个元素作为轴元素,对表进行划分
    	while(i<j)
    	{
    		while((i < j)&&(a[j]>=x))//j从表的高端左移,一直到第一个比轴元素小得元素才停下来
    		j--;
    		if(i<j)
    		{						//如果该位置不是i的位置,则将该元素移到i位置
    			a[i]=a[j];
    			i++;
    		}
    		while((i < j)&&(a[i]<=x))//i从表的低端右移,一直到第一个比轴元素大得元素才停下来
    		i++;
    		if(i<j)
    		{						//如果该位置不是j的位置,则将该元素移到j位置
    			a[j]=a[i];
    			j--;
    		}
    	}
    	a[i]=x;					//i=j时把轴元素放上去
    	qksort(a,L,j-1);
    	qksort(a,j+1,H);
    } 

    2、考点归纳

      快速排序在要排序的数据已基本有序的情况下,不利于其长处

    3、有一组键值 27,84,21,47,15,25,68,35,24,采用快速排序方法由小到大进行 排序,请写出每趟的结果。

      第一趟

      第二趟

      第三趟

    六、堆排序

    1、堆排序的特点

      大顶堆满足只要一个结点存在左右孩子结点,则必须满足该结点大于左孩 子结点且大于右孩子结点。小顶堆满足只要一个结点存在左右孩子结点,则必须满足该结 点小于左孩子结点且小于右孩子结点。

    2、将关键字 5、 56、 20、 23、 40、 38、 29、 61、 35、 76、 28、 98序列进行堆排序(大根堆),画出堆排序过程。

      1)构建初始的大顶堆

      

      2)堆排序过程

      

    七、二路归并排序

      1、设一组初始记录关键字序列为(25,50,15,35,80,85,20,40,36, 70,求用归并排序过程

      

    八、基数排序

      1、对 278、109、063、930、589、184、505、269、008、083 进行基数排 序,并给出详细的排序过程

      第一趟

      

      结果:

      

      第二趟

      

      结果:

      

      第三趟

      

      结果:

      

  • 相关阅读:
    Java--泛型
    Java--文档注释
    Java--网络编程
    Java--序列化
    Java--多线程编程
    Java--ConcurrentHashMap原理分析
    HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别
    面向接口编程详解
    面向接口编程
    base64 数据加密
  • 原文地址:https://www.cnblogs.com/wxt19941024/p/7468650.html
Copyright © 2011-2022 走看看