zoukankan      html  css  js  c++  java
  • 快速排序的一个小坑

    第一版不知为何一直报错,代码如下

    
    int partition(int a[], int low, int high)
    {
    	int key = a[low];
    	while (low < high)
    	{
    		while (a[high] >= key && low<high) high--;
    		a[low] = a[high];
    		while (a[low] <= key && low<high) low++;
    		a[high] = a[low];
    	}
    	printf("%d %d", low, high);
    	printf("
    ");
    	a[low] = key;
    	return low;
    
    }
    
    void quickSort(int a[], int low, int high)
    {
    	if (low == high) return;
    	int pivot = partition(a, low, high);
    	quickSort(a, low, pivot - 1);
    	quickSort(a, pivot + 1, high);
    }
    int main()
    {
    	//int a[] = { 46,87,123,12,9,55,3 };
    	//int a[] = { 1,2,3,4,5,6,7 };
    	int a[] = { 7,6,5,4,3,2,1 };
    	//insertSort(a, 7);
    	// bbleSort(a, 7);
    	// lectSort(a, 7);
    	//mergeSort(a, 0, 6);
    	quickSort(a, 0, 6);
    
    	for (int i = 0; i < 7; i++)
    		printf("%d ", a[i]);
    	while (1);
    	return 0;
    }
    
    

    后来发现,当low==pivot时,下面这句话会有问题:

    	quickSort(a, low, pivot - 1);
    

    于是改为:

        if (pivot > low)
    		quickSort(a, low, pivot - 1);
        quickSort(a, pivot + 1, high);
    

    仍然不对,最后发现是下面那句也要改:

    	if (pivot > low)
    		quickSort(a, low, pivot - 1);
    	if(pivot<high)
    		quickSort(a, pivot + 1, high);
    

    但是书上和网上的标答都没有这么麻烦啊??最后发现:我的递归出口是low=hight,而标答是low>=high,如果这样一改,刚才的两句if也就不需要了:

    void quickSort(int a[], int low, int high)
    {
    	if (low >= high) return;
    	int pivot = partition(a, low, high);
    	//if (pivot > low)
    		quickSort(a, low, pivot - 1);
    	//if(pivot<high)
    		quickSort(a, pivot + 1, high);
    }
    
  • 相关阅读:
    (二)、一步一步学GTK+之窗口
    phpcms v9 评论的bug.
    为discuz x2.5添加播放附件(mp4)的方法
    code::blocks + C + lua 编译环境
    C语言从声卡录音的一个demo
    泛型集合(.NET 2.0)
    VS2008对ASP.NET引用的外部JS文件不能调试
    for循环和foreach
    CSS之DIV上下左右居中
    GridView控件相关(来自互联网)
  • 原文地址:https://www.cnblogs.com/YuQiao0303/p/9609716.html
Copyright © 2011-2022 走看看