1. 程式人生 > 其它 >Python 獲取動漫番劇 -XXOO

Python 獲取動漫番劇 -XXOO

技術標籤:筆記快速排序c語言

快速排序C語言版(附帶視訊講解)

注:3種快排的名字是我自己取的,並非專業名稱

方法一(最常用的方法):左端抽軸(pivot)法

思路 && 操作:

  1. 排序準備:取左邊第一位數為pivot軸,即pivot = a[0],
    再令left = a[0],right = a[N-1]
  2. 排序過程:此時從右端(right)開始,比較right對應的數
    與pivot軸的大小,如果右邊比pivot大(a[right] > pivot)
    下標左移(right–),反之,將a[right]放在a[left]位置
  3. 完成一次操作(PartSort())迴圈結束條件為:left != right
  4. 遞迴函式進入條件:left < right

視訊講解:請點選->動畫

程式碼如下:


#include <stdio.h>
#define N 15

int PartSort(int * a, int left, int right);
void QuickSort(int * a, int left, int right);
void Print(int * a);

int main(void)
{
	int i, a[N] = {5, 8, 1, 7, 4, 9, 48, 14, 0, 99, 45, 2, 84, 65, 6};

	printf("Before sort:\n"
); Print(a); printf("\nAfter sort:\n"); QuickSort(a, 0, N-1); Print(a); return 0; } int PartSort(int * a, int left, int right) { int pivot = a[left]; while (left != right) { while (left < right && a[right] >= pivot) right --; a[left] = a[right]; while (left <
right && a[left] <= pivot) left ++; a[right] = a[left]; } a[left] = pivot; return left; } void QuickSort(int * a, int left, int right) { int mid = 0; if (left < right) { mid = PartSort(a, left, right); QuickSort(a, left, mid-1); QuickSort(a, mid+1, right); } return; } void Print(int * a) { int i; for (i = 0; i < N; i ++) printf("%d ", a[i]); printf("\n"); return; }

執行結果如下:
devc++執行結果
方法二:右端基準(basic)法

思路 && 操作:

  1. 排序準備:選取最右端數字為basic(基準),最左端標記為L(left),
    右端倒數第二個數標記為R(right)
  2. 排序過程:從左端開始,L指向的數比basic所指數小,則L向後移動一位(left++)
    否則則停下;後,右端開始出發,如果R所指向的數字比basic大,則R向前移動
    一位(right–),直到R也停下,此時將二者對應的數字進行交換,L後移,R前移
    各一位完畢後,再從左端開始重複以上操作
  3. 完成一次操作(PartSort())迴圈結束條件為 :left < rigt(而非left != rigt)
    因為數字交換導致的L和R分別進位可能會導致二者"擦肩而過",永世不得相遇
  4. 遞迴函式進入條件為:left < right 程式碼如下

視訊講解:請點選->動畫

注:該視訊所講述略有瑕疵,視訊中說L(left)與R(right)相遇後,L與R所指的同一個數(a)要與basic基準交換。實際上,交不交換取決於該數(a)與basic的大小,如果該數(a)大於basic基準,肯定要作交換,但是反之,就不能直接交換了,需要用該數(a)的下一個數與basic交換,想想為什麼

舉個例子:3 2 1 5(basic) —進行操作— 3 2 1 5(basic)

​ L R ----doing… — L&R

這個時候1 就不能和 5 換位置,換了就變成 3 2 5 1,1比5小怎麼在5右側?

實際上:每一次的basic的軸都是將一組數分割成兩組的中心軸!

程式碼如下:

#include <stdio.h> 
#define N 15 

void Swap(int * a, int left, int basic);
int PartSort(int * a, int left, int right);
void QuickSort(int * a, int left, int right);
void Print(int * a);

int main(void)
{
	int a[N] = {5, 8, 1, 7, 4, 9, 48, 14, 0, 99, 45, 2, 84, 65, 6};

	printf("Before sort:\n");
	Print(a);
	QuickSort(a, 0, N-1);
	printf("\nAfter sort:\n");
	Print(a);
	
	return 0;
} 

void Swap(int * a, int left, int  param)
{
	int temp;
	temp = a[left];
	a[left] = a[param];
	a[param] = temp;

    return;
}

int PartSort(int * a, int left, int right)
{
	int basic = right --;
	
	while (left < right)
	{
		while (left < right && a[left] <= a[basic])
		   left ++;
		while (left < right && a[right] >= a[basic])
		   right --;
		if (left != right)  
		{
			Swap(a, left, right);
			left ++;
			right --;
	    }
		
	}
	if (a[left] > a[basic])  Swap(a, left, basic);
	else  Swap(a, ++ left, basic);
	
	return left;
}

void QuickSort(int * a, int left, int right)
{
	int mid = 0;
	
	if (left < right)
	{
		mid = PartSort(a, left, right);
		QuickSort(a, left, mid-1);
		QuickSort(a, mid+1, right);
	}
	
	return;
}

void Print(int * a)
{
	int i;
	for (i = 0; i < N; i ++)
	   printf("%d ", a[i]);
	printf("\n");
	return;
}

執行結果如下:
devc++執行結果
方法三:快慢指標(i,j)法

思路 && 操作:

  1. 排序準備:快慢指標的構建,i為慢指標,j為快指標;取最右端為pivot軸
    指標初始位置為: j為最左端,i為j的前一位(沒錯,剛開始i不對應數字)
  2. 排序過程:如果快指標j對應的數字比pivot小,則慢指標i前進1位, 然後將
    快慢指標對應的值進行交換;如果快指標j對應的數字比pivot大,則慢指標i
    不動最後,將慢指標右1位的數字(即i+1)對應的數字與pivot軸進行交換
  3. 完成一次操作(PartSort())迴圈結束條件為:快指標小於pivot軸位置(即j < pivot)
  4. 遞迴函式進入條件:start < end

視訊講解:請點選->視訊

程式碼如下:

#include <stdio.h>
#define N 15

void QuickSort(int * a, int start, int end);
int PartSort(int * a, int start, int end);
void Swap(int * a, int i, int j);
void Print(int * a);

int main(void)
{
	int a[N] = {5, 8, 1, 7, 4, 9, 48, 14, 0, 99, 45, 2, 84, 65, 6};
	
	printf("Before sort:\n");
	Print(a);
	QuickSort(a, 0, N-1);
	printf("\nAfter sort:\n");
	Print(a); 
	
	return 0;
} 

void QuickSort(int * a, int start, int end)
{
	int mid = 0;
	
   if (start < end)
	{
		mid = PartSort(a, start, end);
		QuickSort(a, start, mid-1);
		QuickSort(a, mid+1, end); 
	} 
	
	return;
}

int PartSort(int * a, int start, int end)
{
	int i = start - 1;
	int j = start, pivot = end;
	
	for (; j < end; j ++)
	{
		if (a[j] < a[pivot])
		{
			i ++;
			Swap(a, i, j);
		}
	}
	Swap(a, i + 1, pivot);
	pivot = i + 1; 
	
	return pivot;
}

void Swap(int * a, int i, int j)
{
	int temp;
	
	temp = a[i];
	a[i] = a[j];
	a[j] = temp;
	
	return;
}

void Print(int * a)
{
	int i;
	for (i = 0; i < N; i ++)
	   printf("%d ", a[i]);
	printf("\n");
	
	return;
}

執行結果如下:
devc++執行結果

以上就是與大家分享的全部內容啦,如果覺得對你有幫助,不妨點贊、收藏哦,當然如果有什麼謬誤,還請大家不吝賜教!謝謝觀看!