經典快速排序,linux純C實現。注意swap方法,並且這個算法還需再敲寫15篇。

代碼可在anycodes在線編譯測試



#include <stdio.h>
void swap(int* a, int* b)
{
	*a = *a ^ *b;
	*b = *a ^ *b;
	*a = *a ^ *b;
}
int partition(int* a, int fI, int lI)
{
	int i = fI-1, j = 0;
	for(j=fI;j<=lI;j++)
	{
		if(*(a+j) < *(a+lI))
		{
			i++;
			if(i != j) swap(a+j, a+i);
		}
	}
	if(i+1 != lI)	swap(a+i+1, a+lI);
	return i+1;
}
void quickSort(int* a, int fI, int lI)
{
	int partI = 0;
	if(fI >= lI)
		return;
	partI = partition(a, fI, lI);
	quickSort(a, fI, partI-1);
	quickSort(a, partI+1, lI);
}
int main()
{
	int a[10] = {241,325425,56765,234,13,34574,4653,5687689,432552,2789};
	int L = sizeof(a) / sizeof(int);
	int i = 0;
	quickSort(a, 0, L-1);
	for(;i<L;i++)
		printf("%d ", *(a+i));
	printf("\n");
	return 0;
}


注意程序中的swap方法是通過指針傳遞的,所以傳遞進去的兩個指針不能是同一個地址,否則,這個地址中的元素值將變成0,所以本程序中在使用是都判斷了是否是同一地址。

經過思考後,把swap進行了簡單的修改:

void swap(int* a, int* b)
{
	if(a == b)
		return;
	*a = *a ^ *b;
	*b = *a ^ *b;
	*a = *a ^ *b;
}

這樣不用擔心a和b爲同一地址後,地址中的數據丟失成0.所以源程序也就修改爲:

#include <stdio.h>
#include <stdlib.h>

void quickSort(int* a, int left, int right);
int partition(int* a, int left, int right);
void swap(int* a, int* b);

int main(int argv, char** argc)
{
	int a[6] = {4, 1, 5, 2, 6, 3};
	int len = sizeof(a) / sizeof(int);
	quickSort(a, 0, len-1);
	for(int i=0;i<len;++i)
		printf("%d ", *(a+i));
	printf("\n");
	return 0;
}

void quickSort(int* a, int left, int right)
{
	if(left >= right)	return;
	int partIndex = partition(a, left, right);
	quickSort(a, left, partIndex-1);
	quickSort(a, partIndex+1, right);
}

int partition(int* a, int left, int right)
{
	int len = right - left;
	int storeIndex = left;
	int i = 0;
	for(i=left;i<=right;++i)
	{
		if(*(a+i) < *(a+right))
		{
			swap(a+i, a+storeIndex);
			storeIndex ++;
		}
	}
	swap(a+storeIndex, a+right);
	return storeIndex;
}

void swap(int* a, int* b)
{
	if(a == b)
		return;
	*a = *a ^ *b;
	*b = *a ^ *b;
	*a = *a ^ *b;
}




發佈了36 篇原創文章 · 獲贊 25 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章