java快速排序和选择排序实现实例解析
作者:胡子拉碴的沙滩裤
一、快速排序(Quick Sort)
快速排序采用分治法。首先从数列中挑出一个元素作为中间值。依次遍历数据,所有比中间值小的元素放在左边,所有比中间值大的元素放在右边。然后按此方法对左右两个子序列分别进行递归操作,直到所有数据有序。最理想的情况是,每次划分所选择的中间数恰好将当前序列几乎等分(均匀排布),整个算法的时间复杂度为O(n logn)
最坏的情况是,每次所选的中间数是当前序列中的最大或最小元素(正序和逆序都是最坏),整个排序算法的时间复杂度为O(n²)。
平均时间复杂度为O(n logn),空间复杂度为O(logn),是一种不稳定的排序算法。
附算法实现源码:
//快速排序 template <class T> int Partition(T data[],int left,int right) { T pivot=data[left]; while(left<right) { while(left<right&&data[right]>pivot) right--; data[left]=data[right]; while(left<right&&data[left]<=pivot) left++; data[right]=data[left]; } data[left]=pivot; return left; } template <class T> void QuickSort(T data[],int left,int right) { if(left<right) { int p=Partition(data,left,right); QuickSort(data,left,p-1); QuickSort(data,p+1,right); } }
二、、选择排序(Selection Sort)
遍历所有数据,先在数据中找出最大或最小的元素,放到序列的起始;然后再从余下的数据中继续寻找最大或最小的元素,依次放到序列中直到所有数据有序。原始数据的排列顺序不会影响程序耗费时间O(n²),相对费时,不适合大量数据排序。
平均时间复杂度为O(n²),空间复杂度为O(1),是一种不稳定的排序算法。
附算法实现源码:
//选择排序 template <class T> void SelectionSort(T data[],int n) { for(int i=1;i<n;i++) { int k=i-1; for(int j=i;j<n;j++) { if(data[j]<data[k]) { k=j; } } if(k!=i-1) { T t=data[k]; data[k]=data[i-1]; data[i-1]=t; } } }
三、插入排序(Insertion Sort)
将前i个(初始为1)数据假定为有序序列,依次遍历数据,将当前数据插入到前述有序序列的适当位置,形成前i+1个有序序列,依次遍历完所有数据,直至序列中所有数据有序。数据是反序时,耗费时间最长O(n²);数据是正序时,耗费时间最短O(n)。适用于部分数据已经排好的少量数据排序。
平均时间复杂度为O(n²),空间复杂度为O(1),是一种稳定的排序算法。
附算法实现源码(直接插入+折半插入):
//直接插入排序 template <class T> void InsertionSort(T Data[],int n) { int p,i; for(p=1;p<n;p++) { T temp=Data[p]; i=p-1; while(i>=0&&Data[i]>temp) { Data[i+1]=Data[i]; i--; } Data[i+1]=temp; } } //折半插入排序 template <class T> void BinaryInsertionSort(T Data[],int n) { int left,mid,right,p; for(p=1;p<n;p++) { T temp=Data[p]; left =0; right=n-1; while(left<=right) { mid=(left+right)/2; if(Data[mid]>temp) right=mid-1; else left=mid+1; } for(int i=p-1;i>=left;i--) Data[i+1]=Data[i]; Data[left]=temp; } }
四、希尔排序(Shell Sort)
希尔排序也称递减增量排序,是对插入排序的改进,以牺牲稳定性的方法提高效率。基本思路是先将整个数据序列分割成若干子序列分别进行直接插入排序,待整个序列中的记录基本有序时,再对全部数据进行依次直接插入排序,直至所有数据有序。希尔排序算法的性能与所选取的分组长度序列有很大关系,复杂度下界为O(n log²n),在中等规模的数据中表现良好。
平均时间复杂度为O(n^3/2),空间复杂度为O(1),是一种不稳定的排序算法。
附算法实现源码:
//希尔排序 template <class T> void ShellSort(T Data[],int n) { int d=n/2; while(d>=1) { for(int k=0;k<d;k++) { for(int i=k+d;i<n;i+=d) { T temp=Data[i]; int j=i-d; while(j>=k&&Data[j]>temp) { Data[j+d]=Data[j]; j-=d; } Data[j+d]=temp; } } d=d/2; } }
以上就是java快速排序和选择排序实现实例解析的详细内容,更多关于java快速排序选择排序的资料请关注脚本之家其它相关文章!