一、疾速排序(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;
}
}
}