?? ?最近编程的时候遇到了各种各样的排序问题,很多时候由于数据量不大,就选择了最好理解最容易写的冒泡排序。随着数据量的增大。发现某些时候还是必须使用快排的,特别是有些时候,还要对高维数组进行排序。下面是我最近写的一个关于二维数组进行排序的快速排序的程序。
??? 程序的算法不是很规范。我就是对一维数组的排序进行了改变。思想不是在比较的时候进行两个数据的比较,而是讲二维的数据按照排序顺序的权重问题先进行了一个计算,转成了一个数字,从而使用一维数组的排序比较得出结果。
??? 按照这种排序的思想则可以实现对多维(数字)进行快速排序。比如三维的数组。我们可以计算出a[0]*100+a[1]*10+a[2]的结果来进行比较,确定是否进行交换。
??? 下面的示例是我写的对一些坐标进行排序。测试数据是:
14
2 1
6 6
4 2
2 5
2 6
2 7
3 4
6 1
6 2
2 3
6 3
6 4
6 5
6 7
参考程序如下:
?
#include <iostream> using namespace std; struct Zuobiao { int x; int y; }point[1000]; void QuickSort(Zuobiao a[],int low,int high) { int i,j; i=low; j=high; if(low>high) //已经找完了 return; int temp = a[low].x*10+a[low].y;//将二维数组转换成一个能比较的数 int temp_x = a[low].x; int temp_y = a[low].y; while(i!=j) //找到要交换的位置 { while( (a[j].x*10+a[j].y)>=temp && j>i) j--; if(j>i) { int pos=i++; a[pos].x=a[j].x; a[pos].y=a[j].y; } while((a[i].x*10+a[i].y) <=temp && j>i) i++; if(j>i) { int pos=j--; a[pos].x=a[i].x; a[pos].y=a[i].y; } } a[i].x=temp_x; a[i].y=temp_y; QuickSort(a,low,i-1); //对左边进行递归 QuickSort(a,i+1,high); //对右边进行递归 } int main() { int N; cin>>N; int i; for(i=1;i<=N;i++) cin>>point[i].x>>point[i].y; QuickSort(point,1,N); for(i=1;i<=N;i++) cout<<point[i].x<<' '<<point[i].y<<endl; return 0; }
?
程序代码可读性不是太好,当时写的主要目的是为了得到答案。像示例的输出结果为:
2 1
2 3
2 5
2 6
2 7
3 4
4 2
6 1
6 2
6 3
6 4
6 5
6 6
6 7
这种就是先对x排序,如果x相同再对y排序的结果。
?