105-對快速排序演算法的實現和分析
阿新 • • 發佈:2020-12-21
快速排序
首先先引入需要用到的輔助函式
#include<stdio.h>
/*輔助函式:
1.列印資料
2.判斷整個資料序列是否已經有序
3.互動兩個資料swap方法
*/
void Show(int *arr,int len)//列印資料
{
for(int i=0;i<len;++i)
{
printf("%d ",arr[i]);
}
printf("\n");
}
bool IsSort(int *arr,int len)//判斷整個資料序列是否已經有序
{
for(int i=0;i<len-1;++i)
{
if(arr[i]>arr[i+1])
{
return false;
}
}
return true;
}
void SwapValue(int *a,int *b)//互動兩個資料swap方法
{
int tmp=*a;
*a=*b;
*b=tmp;
}
快速排序的思想
1、選擇一個基準 以當前待排序序列的第一個資料作為基準
2、通過操作使用基準資料將待排序資料序列劃分成:
左部分(比基準資料都小)
右部分(比基準資料都大)
3、對左部分和右部分分別執行以上過程,直到沒有左部分和右部分或者兩部分只剩下一個數據
接下來對快速排序演算法的實現
int OneQuick(int *arr,int left,int right)
{
int tmp=arr[left];
while(left<right)
{
//從right向前找比基準資料小的
while(left<right&&arr[right]>=tmp)
{
right--;
}
arr[left]=arr[right];
//從left向後找比基準資料大的
while(left<right&&arr[left]<=tmp)
{
left++ ;
}
arr[right]=arr[left];
}
arr[left]=tmp;
return left;
}
void Quick(int *arr,int left,int right)
{
int mid=OneQuick(arr,left,right);
if(mid-left>1)//左部分至少有兩個資料
{
Quick(arr,left,mid-1);
}
if(right-mid>1)//右部分至少有兩個資料
{
Quick(arr,mid+1,right);
}
}
void QuickSort(int *arr,int len)
{
Quick(arr,0,len-1);
}
最後完成主函式
int main()
{
int arr[]={7,87,29,75,41,50,62,92,69,22,76,77,35};
Show(arr,sizeof(arr)/sizeof(arr[0]));
QuickSort(arr,sizeof(arr)/sizeof(arr[0]));
Show(arr,sizeof(arr)/sizeof(arr[0]));
return 0;
}
執行結果如下
快速排序演算法的分析
時間複雜度: O(nlogn)
空間複雜度: O(logn)
穩定性: 不穩定
優化方法: 通過使用棧 讓消耗空間變少 還可以及時對記憶體空間進行判滿
void Quick2(int *arr,int left,int right)
{
Stack st;//記錄待排序序列的下標
InitStack(&st);
Push(&st,right);
Push(&st,left);
while(!IsEmpty(&st))
{
int start,end;
Top(&st,&start);
Pop(&st);
Top(&st,&end);
Pop(&st);
int mid=OneQuick(arr,start,end);
if(mid-start>1)
{
Push(&st,mid-1);
Push(&st,start);
}
if(end-mid>1)
{
Push(&st,end);
Push(&st,mid+1);
}
}
DestroyStack(&st);
}