交换排序(冒泡、快速)
文章目录
一、 交换排序的思路
二、冒泡排序
三、快速排序
一、 交换排序的思路
/*交换函数*/
void swap(int a[],int i,int j)
{
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
二、冒泡排序
/*冒泡排序优化版*/
void BubbleSort()
{
int i,j;
int flag=1;
for(i=1;i<n;i++)
{
flag=0;
for(j=i+1;j<=n;j++)
{
if(a[i]>a[j])
{
swap(a,i,j);
flag=1;
}
}
}
}
三、快速排序
通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对着两部分记录继续进行排序,以达到整个序列有序的目的。
三数区中:三个关键字先进行排序,将中间数作为枢轴,一般是取左端。右端和中间三个数。
/*快排*/
int Partition(int A[],int low,int high)
{
int pivot=A[low];
while(low<high){
while(low<high&&A[high]>=pivot)
high--;
A[low]=A[high];
while(low<high&&A[low]<=pivot)
low++;
A[high]=A[low];
}
A[low]=pivot;
return low;
}
void QuickSort(int A[],int low,int high)
{
if(Cutoff<=(Right-Left)){
/* if(low<high){ int pivotpos=Partition(A,low,high); QuickSort(A,low,pivotpos-1); QuichSort(A,pivotpos+1,high); } */
while(low<high){
int pivotpos=Partition(A,low,high);
QuickSort(A,low,pivotpos-1);
low=pivotpos+1;
}
}
else
Insertion_Sort(A);
}
/*快排优化*/
int Median3(int A[],int Left,int Right)
{
int Center=(Left+Right)/2;
if(A[Left]>A[Center])
Swap(&A[Left],&A[Center]);
if(A[Left]>A[Right])
Swap(&A[Left],&A[Right]);
if(A[Center]>A[Right])
Swap(&A[Center],&A[Right]);
Swap(&A[Center],&A[Right-1]);
return A[Right-1];
}
void Quicksort(int A[],int Left,int Right)
{
if(Cutoff<=(Right-Left)){
Pivot=Median3(A,Left,Right);
i=Left;j=Right-1;
for(;;){
while(A[++i]<Pivot){
}
while(A[--j]>Pivot){
}
if(i<j)
Swap(&A[i],&A[j]);
else break;
}
Swap(&A[i],&A[Right-1]);
Quicksort(A,Left,i-1);
Quicksort(A,i+1,Right);
}
else
Insertion_Sort(A+Left,Right-Left+1);
}