学習アルゴリズム:クイックソート

1. 無秩序アレイにおいて、第一の基準値をキーとして(通常は配列要素0を見つけるために)数を見つける
のにその小さい、基準よりも大きな値の左側の基準値よりも2右側(それは小さいよりも左の鍵は、それが右より大きいので)
、同じものもソートするのと同じ方法を使用して右のキーデータの同じ種類を使用しての重要な方法で残っている3.データ方法:再帰

質問:キー大型の右側よりも左側に小さな鍵を置くよりも、どうすればよいですか?

1.キーに割り当てられた配列の0番目の要素(掘削)
別の掘り込みAに続いて、次いで、(割り当てられた値の前にピットが見つかりました)充填ピットの前にある小さなキーを見つけるために、左より右から2ピット。
キーの後ろの左から右に見て3は、充填穴よりも大きいが、穴の前で、この時間は、掘っ
4. 2〜3工程サイクル
最後に5キーでいっぱいピット

/*
	@brief: 快速排序函数
	@param:	int *a接收数组地址
	@param:	int left数组左边的下标
	@param:	int right数组右边一个下标
	@return 无返回值
*/
void quick_sort(int *a, int left, int right)
{
	int n = left;
	int m = right;
	int key = a[n];
	
	if(n >= m)
		return;
	while(n < m)
	{
		//从右边往左边找比key小的值
		while(n < m && a[m] >= key)
			m--;
		//如果找到了要填前面的坑
		if(n < m)
			a[n] = a[m];
		else
			break;
		//从左边往右边找比key大的值
		while(n < m && a[n] <= key)
			n++;
		//如果找到了要填后面的坑
		if(n < m)
			a[m] = a[n];
		else
			break;
	}
	//最后一个坑
	a[n] = key;	//a[m] = key;也可以因为最后一个坑的时候m == n
	//对key左边的部分排序
	quick_sort(a, left, n-1);
	//对key右边的部分排序
	quick_sort(a, n+1, right);
}
int main(void)
{
	int a[] = {9, 6, 2, 4, 6, 4, 0, 6, 2, 0};
	int n = 0;
	int m = sizeof(a)/sizeof(a[0]) - 1;	//m = 10 - 1;
	quick_sort(a, n, m);
	int i;
	for(i = 0; i < 10; i++)
		printf("%d ", a[i]);
	printf("\n");
	
	return 0;
}
公開された50元の記事 ウォンの賞賛5 ビュー1531

おすすめ

転載: blog.csdn.net/qq_42483691/article/details/104581648
おすすめ