排序(Sort)

排序(Sort)是将无序的记录序列(或称文件)调整成有序的序列。

排序的目的是方便我们队数据查询记录、修改记录等操作。

 

排序的分类

按稳定性可分为稳定排序和非稳定排序,按待排序数据的存储位置又可分为内排序和外排序。


截止目前,各种内排序方法可归纳为以下五类:
(1)插入排序
(2)交换排序
(3)选择排序
(4)归并排序
(5)基数排序。

本次介绍的是简单常用的快速排序算法,直接快速排序属于交换排序算法!

 

快速排序

经过key的一趟比较后,确定某个记录在排序后的最终位置。

 

算法思路

一趟排序的过程:选择一个基准,将右端元素中所有比基准小的数值交换到左边,然后将左边所有比基准大的数值放到右边。经过反复比较、交换,最终确定基准的位置。

递归调用实现排序:将原序列分成左右两个部分。再对每个子序列进行同样的操作,最终排序完毕。

递归过程:在递归实现中,分别有两次对自身进行调用。先对左子序列进行递推操作(确定左子序列的基准位置)直到达到回归条件,在第一个quicksort函数回归的过程中,同时也是第二个quicksort函数递推(确定右子序列的基准的位置)的过程,直到整个递归过程结束,也就排完序了。

//一趟快速排序
int quickpass(int a[],int i,int j)
{
      int tmp;
      tmp = a[i];   //将a[i]作为基准保存
      while(i < j){
	    //从上界比较
	    while(i < j && tmp <= a[j])
		  j--;
	    //将a[j]交换到左边
	    if(i < j)
		  a[i] =a[j];
	    //从下界比较
	    while(i < j && tmp >= a[i])
		  i++;
	    //将a[i]交换到右边
	    if(i < j)
		  a[j] = a[i];
      }
      a[i] = tmp;   //将基准放到最终的位置
      return i;	  //返回基准的下标
}

void quicksort(int a[],int low,int high)
{
      int mid;
      if(low < high){
	    mid = quickpass(a,low,high);   //一趟快速排序 
	    show(a);
	    quicksort(a,low,mid-1);   //基准左边序列进行快速排序
	    quicksort(a,mid+1,high);   //基准右边序列进行快速排序
      }
}

 

过程分析

数据结构与算法学习笔记 (14)--排序算法之快速排序_算法