快速排序算法

学而时习之,不亦说乎


在最坏的情况下,快速排序算法实际上要逊于归并排序与堆排序。但是,快速排序的平均速度要优于以上两种算法,而且在算法中无需额外的存储空间。

快速排序的思想是,将数组序列A划为两部分,以下标i分界,小于下标i的数组元素,其值均小于A[i],大于下标i的数组元素,其值均大于A[i]. 通过递归最终实现排序。

算法的关键是如何选取下标i,并且通过原址排序,将数组分为两部分。下面的示例算法中,首先选取数组最后的一个元素作为标志,将大于该元素的值向右移动,小于该元素的值向左移动,最后将这最后一个元素插入(实际上是交换)到数组中合适的位置。这部分的思路不是很容易理解(真是佩服想到这个算法的人...)结合代码看看吧...


C++代码示例:

int main()
{
    int A[] = {23, 17, 14, 6, 13, 10, 1, 5, 7, 12, -9, 36, 72, 113, -10, 0};
    QuickSort(A, 0, 15);

    system("pause");
    return 0;
}

// Divide an array into two parts
int Partition(int* A, int p, int r)
{
    int x = A[r];
    int index = p - 1;

    for (int i = p; i < r; i++)
    {
        if (A[i] <= x)
        {
            index++;
            
            int temp = A[i];
            A[i] = A[index];
            A[index] = temp;
        }
    }

    A[r] = A[index + 1];
    A[index + 1] = x;

    return index + 1;
}

void QuickSort(int* A, int p, int r)
{
    int q = Partition(A, p, r);

    if (q <= p || q >= r)
    {
        return;
    }

    QuickSort(A, p, q - 1);
    QuickSort(A, q + 1, r);
}


Java代码示例:
public class Hello {
	
	public static void main(String[] args) {
		int A[] = {23, 17, 14, 6, 13, 10, 1, 5, 7, 12, -9, 36, 72, 113, -10, 0};
		
		quickSort(A, 0, 15);
		
		for (int i : A) {
			System.out.print(i + ", ");
		}
	}

	public static void quickSort(int [] A, int p, int r) {
		int q = partition(A, p, r);
		if (q <= p || q >= r) {
			return ;
		}
		
		quickSort(A, p, q - 1);
		quickSort(A, q + 1, r);
	}
	
	public static int partition(int [] A, int p, int r) {
		int x = A[r];
		int index = p - 1;
		
		for (int i = p; i < r; i++) {
			if (A[i] <= x) {
				index++;
				
				int temp = A[i];
				A[i] = A[index];
				A[index] = temp;
			}
		}
		
		A[r] = A[index + 1];
		A[index + 1] = x;
		return index + 1;
	}
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值