Bootstrap

快速排序 归并排序

 快速排序(重点)

//quick_sort

void quick_sort(int a,int l,int r)
{
    if(l>=r) return;
    
    int i=l-1,j=r+1;            //所谓的 “ 双 指 针 ”
    int x=a[(l+r)/2];

     while(i<j)
	{    
		do i++;while(a[i]<x);    //不能等于x
		do j--;while(a[j]>x);
		if(i<j)
		{
			swap(a[i],a[j]);    //不合法则交换; 
		} 
	}

	quick_sort(a,l,j);
	quick_sort(a,j+1,r);

}
//算例: 1 3 2 6 5 
//算例: 4 1 4 2 5 

/*划分一个中间数。双指针向中间移动,最后的结果是将数组划分成两个区间;
然后以j为分界线进行划分。
在图中会表现为i和j “ 擦 肩 而 过 ” 
*/

归并排序

//merge_sort

void merge_sort(int a,int l,int r)
{
    if(l>=r) return;
    
   int m=(l+r)/2;
   merge_sort(a,l,m);
   merge_sort(a,m+1,r);
   
   int t[10],k=0;//存储合并之后的结果 
   int i=l,j=m+1;
 
	while(i<=m&&j<=r)
	{
		if(a[i]<a[j]) t[k++]=a[i++];
		else t[k++]=a[j++];
	} 
	
	while(j<=r) t[k++]=a[j++];
	while(i<=m) t[k++]=a[i++];
	
	for(int i=l,j=0;i<=r;i++,j++)  //将原来的数组粘贴到对应的位置当中去
	 
	{
		a[i]=t[j];
	}
}

/*
非常有趣的一个排序:
以m为界限不断的细分(调用自己)
所以在每一次调用的时候都会出现一个新的l和r,
不能再分时:(只有一个元素)先写入数组t[](“排序”),然后在写入上个数组t。
t是一个中间数组,通过写入的方式实现了“排序“。

*/

;