c語言關於快速排序?

對於一維的數組排序很簡單

但是如果是兩個關聯的二維數組同時要滿足升序怎麼做呢?

就是比如說(1,5)(2,3)(1,2)排序完是(1,2)(1,5)(2,3)


類似於excel表的排序。

分主序和次序,主序相同的按次序排。

struct Data {

int a;

int b;

};

定義"da &< db":

if (da.a & //進行da &< db相關操作


比如... (0, 5) (1, 4), (2, 3), (3, 2), (4, 1), (5, 0) 同時滿足升序?


額。。好像C沒有重載運算符哦。。記錯了。。那就改一下好了

用結構體表示二維數組唄

#include &
#include &

typedef struct point2d {
int x, y;
}point2d;

int cmp(const void* lhs, const void* rhs) {
point2d arg1 = *(const point2d*)lhs;
point2d arg2 = *(const point2d*)rhs;
if (arg1.x &< arg2.x || arg1.x == arg2.x arg1.y &< arg2.y) return -1; if (arg2.x &< arg1.x || arg2.x == arg1.x arg2.y &< arg1.y) return 1; return 0; } int main() { point2d arr[3]; for (int i = 0; i &< 3; ++i) scanf("%d%d", arr[i].x, arr[i].y); qsort(arr, 3, sizeof(arr[0]), cmp); for (int i = 0; i &< 3; ++i) printf("(%d,%d) ", arr[i].x, arr[i].y); }

input:

1 5
2 3
1 2

output:

(1,2)
(1,5)
(2,3)

.


看你選哪個為主要素,哪個為次要素。先對主要素排序,主要素相同的再用次要素排序


如果你想要實現簡單的話,可以先對第二個坐標進行排序,然後再對第一個坐標進行排序。

當然,這樣的時間複雜度要更大一些。

或者你可以直接用比較的時候這麼寫(爪機打字的,見諒)

假設用的是struct point {

int x;

int y;

}

偽代碼:

if(p[i].x&>p[i+1].x)

//交換

else if(p[i].x==p[i+1].x p[i].y&>p[i+1].y)

//交換

如果你會qsort的話,也是類似的比較。


題主,你如果明白幾種排序方法的原理就能得出所有的排序本質是兩兩比較,然後交換位置的結論。不同的排序方法區別在於兩個比較數的選擇。

快排是從兩端向中間靠攏選擇比較數,關鍵數是你任意選的。然後一輪比較排序完畢之後關鍵數將整個數組分為兩段新數組,一段全部不小於關鍵數,另一段不大於關鍵數。遞歸比較排序新的數組可以得到排序完成的數組。

以上是快排的排序思想,不涉及到排序完成後是升序還是降序。這是因為升序和降序取決於交換動作執行語句前的判斷條件。(這一句是重點)你再看一下自己寫的代碼,看看那句判斷條件,把它修改成降序(升序)。接著再看你提出的問題。本質上是主要因素和次要因素的問題。那麼判斷條件只需要修改為先比較第一個數,如果第一個數相等再判斷第二個數。

總結就是這個排序和排序方法是沒有關係的,區別都在於判斷條件。所以調用庫函數時需要你自己寫一個比較函數。


寫一個struct

然後寫camp函數(用來比較兩個struct的大小)

然後用stdlib裡面的qsort函數

更新一下:

std::sort函數的第三個參數就是外接一個比較函數,返回bool值的,用於比較大小

或者使用基數排序,先對第二個數排再對第一個數排


沒太看懂題主的意思


推薦閱讀:

試問和直接選擇排序比起來,簡單選擇排序的意義何在?
為什麼在平均情況下快速排序比堆排序要優秀?
冒泡排序為什麼會被看做經典,寫入所有C語言的教科書?

TAG:演算法 | C編程語言 | 排序演算法 | 快速排序 |