快排算法

快排C++版

#include<iostream>
using namespace std;

// arr 是一个二维数组
// arr 需要排序arr的开始位
// arr 需要排序arr的结束位
// x 表示要比较的二维数组的维
void qsort(int arr[][2], int start, int end, int x)
{
    int i = start; // 用i, j相当于保留原始的start,end,下面会用到边界
    int j = end;
    int key = arr[i][x];
	int t0, t1;
    while (i < j)
	{
		// 向左移动直到位置j的值小于key
        while ((key <= arr[j][x]) && (i < j))
        {
			j -= 1;
		}
		
		// 出现小于key的j时,交换arr[i] 和arr[j] 的值
        t0 = arr[i][0];
		t1 = arr[i][1];
        arr[i][0] = arr[j][0];
		arr[i][1] = arr[j][1];
        arr[j][0] = t0;
		arr[j][1] = t1;
		
		// 向右移动直到位置i的值大于key
        while ((key >= arr[i][x]) && (i < j))
		{
            i += 1;
		}
		
		// 出现大于key的i时,交换arr[i] 和arr[j] 的值
        t0 = arr[i][0];
		t1 = arr[i][1];
        arr[i][0] = arr[j][0];
		arr[i][1] = arr[j][1];
        arr[j][0] = t0;
		arr[j][1] = t1;
	}
	// 以上代码到这儿,位置i == j的那个值就永远固定了,他左侧的数都比他小,右侧的数都比他大
    if (i > start)
	{
		// 递归对左侧数据排序
        qsort(arr, start, i - 1, x);
	}
    if (j < end)
	{
		// 递归对右侧数据排序
        qsort(arr, j + 1, end, x);
	}
}

int main()
{
    int arr[12][2] = {{1,3}, {2,5}, {3, 1}, {4,3}, {5,14}, {6, 1}, {7,3}, {8,4}, {9, 1}, {10,11}, {11,4}, {12, 1}};
	int len = 12;
	// 排序前输出
    for(int i = 0; i < len; i++)
	{
		cout<<arr[i][0]<<" "<<arr[i][1]<<endl;
	}
	cout<<endl;
	// 如果x为0,则对二维数组的第一维排序,如果x为1,则对二维数组的第二维排序
	int x = 0; 
    qsort(arr, 0, len - 1, x);
	// 排序后输出,可以改变x测试结果
    for(int i = 0; i < len; i++)
	{
		cout<<arr[i][0]<<" "<<arr[i][1]<<endl;
	}
	return 0;
}
快排Python版

'''
Created on 2013-9-3

@author: gudh
'''

def qsort(arr, start, end, x):
    i = start
    j = end
    key = arr[i][x]
    while i < j:
        while key <= arr[j][x] and i < j:
            j -= 1
        t = arr[i]
        arr[i] = arr[j]
        arr[j] = t
        while key >= arr[i][x] and i < j:
            i += 1
        t = arr[i]
        arr[i] = arr[j]
        arr[j] = t
    if i > start:
        qsort(arr, start, i - 1, x)
    if j < end:
        qsort(arr, j + 1, end, x)

if __name__ == '__main__':
    arr = []
    import random
    for i in range(1000):
        arr.append((i, random.random()))
    print arr
    qsort(arr, 0, len(arr) - 1, 1)
    print arr
    
    for i in range(99):
        if arr[i][1] > arr[i+1][1]:
            print i,arr[i], arr[i+1], False

你可能感兴趣的:(快排)