快速排序的三种写法

大耗子 2020年07月17日 119次浏览

方法1:前面放一个指针的方法

void quick(int *arr, int len, int start, int end)
{
	int low = start;
	for (int i = start + 1; i < end + 1; i++)
	{
		if (arr[i] < arr[start]){
			low++;
			if (low != i){
				swap(&arr[low], &arr[i]);
			}
		}
	}
	swap(&arr[low], &arr[start]);

	if (low-1 > start)
		quick(arr, len, start, low - 1);
	if (low+1 < end)
		quick(arr, len, low+1, end);

}

void sort_quick(int *arr, int len)
{
	quick(arr, len, 0, len - 1);
}

方法2:前后指针交换法

//快速排序
void Sort_Quick(int* arr, int low, int high)
{
	if (low >= high)
		return;
	int temp = arr[low];//中间参考值
	int b = low+1;//从第二个值开始,第一个值作为中间值
	int e = high;
	while (b <=e)
	{
		while (arr[b] <= temp && b <= e)//找到左边值大于参考值
			b++;
		while (arr[e] >= temp && b <= e)//找到右边值小于参考值
			e--;
		if (b<e)//位置相同和位置交叉不交换
		{
			Sort_swap(arr[b], arr[e]);//对应下表值交换
			b++;
			e--;
		}
	}
	arr[low] = arr[e];//所有大于参考值的左一个值
	arr[e] = temp;//参考值去到对应位置
	Sort_Quick(arr, low, e - 1);//分割
	Sort_Quick(arr, e + 1, high);
}
void Sort_Quick(int* arr, int len)
{
	printf("快速排序法\n");
	Sort_Quick(arr, 0, len - 1);
//	cout << Sort_check(arr, len) << endl;
}

方法3:前后轮流交换法

void quick(int *arr,int start, int end)
{
    if(start>=end) return;
    // 设置基准key
    int key = arr[start];
    int l = start;
    int h = end;
    while(l<h)
    {

        while(l<h && key >= arr[h])
            h--;
        arr[l] = arr[h];
        while(l<h && key <= arr[l])
            l++;
        arr[h] = arr[l];
    }
    arr[l] = key;
    // 分割数组(逻辑上)
    quick(arr,start,l-1);
    quick(arr,l+1,end);
}
// 快速排序
void sortQuick(int *arr, int len)
{
    quick(arr,0,len-1);
}