1. 程式人生 > 其它 >105-對快速排序演算法的實現和分析

105-對快速排序演算法的實現和分析

技術標籤:基礎演算法排序演算法快速排序演算法

快速排序

首先先引入需要用到的輔助函式

#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); 
}