快排之C語言(各種資料的排序)

2021-10-19 13:19:43 字數 3612 閱讀 3313

關於快排的一些小問題

1.快排是不穩定的,這個不穩定乙個表現在其使用的時間是不確定的,最好情況(o(n))和最壞情況(o(n^2))差距太大,我們一般說的o(nlog(n))都是指的是其平均時間

2.快排是不穩定的,這個不穩定表現在如果相同的比較元素,可能順序不一樣,假設我們有這樣乙個序列,3,3,3,但是這三個3是有區別的,我們標記為3a,3b,3c,快排後的結果不一定就是3a,3b,3c這樣的排列,所以在某些特定場合我們要用結構體來使其穩定(<6>的例子就是說明這個問題的)

3.快排的比較函式的兩個引數必須都是const void *的,這個要特別注意,寫a和b只是我的個人喜好,寫成cmp也只是我的個人喜好.推薦在cmp裡面重新定義兩個指標來強制型別轉換,特別是在對結構體進行排序的時候

4.快排qsort的第三個引數,那個sizeof,推薦是使用sizeof(s[0])這樣,特別是對結構體,往往自己定義2*sizeof(int)這樣的會出問題,用sizeof(s[0)既方便又保險

5.如果要對陣列進行部分排序,比如對乙個s[n]的陣列排列其從s[i]開始的m個元素,只需要在第乙個和第二個引數上進行一些修改:qsort(&s[i],m,sizeof(s[i]),cmp)快排既不能用於過大也不能用於過小的資料,都會影響速度

首先是手工實現c的快排(每一步都有停頓)

#include

#include

intmain()

;for

(int i =

0;i <

9;i++

)printf

("\n\n");

sort

(a,0,8

);for(

int i =

0;i <

9;i++

)printf

("%d "

,a[i]);

return0;

}void

sort

(int a[9]

,int low,

int high)

system

("pause");

while

(left < right)

a[right]

= key;

printf

("\nkey = a[right] = %d right = %d \n"

,key,right)

;sort

(a,right+

1,high)

;sort

(a,low,left-1)

;}}

下面是 stdlib.h 庫中的函式

//<1> 

/* qsort-int型

*/#include

#include

intcmp

(const

void

*a,const

void

*b)int

main()

;int n =10;

// scanf("%d",&n); //手動輸入

// for(int i= 0;i < n;i++)

// qsort

(a,n,

sizeof

(a[0])

,cmp)

;for

(int i =

0;i < n;i++

)printf

("%d\n"

,a[i]);

return0;

}

//<2>

/* qsotr-double型 同 int型

*/#include

#include

intcmp

(const

void

*a,const

void

*b)int

main()

;int n =10;

// scanf("%d",&n); //手動輸入

// for(int i = 0;i < n;i++)

// qsort

(a,n,

sizeof

(a[0])

,cmp)

;for

(int i =

0;i < n;i++

)printf

("%.2lf\n"

,a[i]);

return0;

}

//<3>

/* qsort-結構體

*/#include

#include

struct tran

;int

cmp(

const

void

*a,const

void

*b)int

main()

;int n =10;

//scanf("%d",&n);

// for(int i = 0;i < n;i++)

// qsort

(a,n,

sizeof

(a[0])

,cmp)

;for

(int i =

0;i < n;i++

)printf

("第%d個為%.2lf\n"

,a[i]

.no,a[i]

.data)

;return0;

}

//<4>

/* qsort-字串陣列 (char a型)

*/#include

#include

intcmp

(const

void

*a,const

void

*b)//先強制轉化為靜態變數即常量,無法更改

intmain()

;qsort

(c,10

,sizeof

(c[0])

,cmp)

;for

(int i =

0;i <

10;i++

)printf

("%s\n"

,c[i]);

return0;

}

//<5>

/* qsort-字串陣列 (char *a型)

*/#include

#include

#include

intcmp

(const

void

*a,const

void

*b)int

main()

qsort

(a,n,

sizeof

(a[0])

,cmp)

;for

(int i =

0;i < n;i++

)printf

("%s\n"

,a[i]);

return0;

}

C 實現各種排序 快排 插排 冒泡

1 插入排序 插入排序 主要思想 將陣列中的第乙個數認為是有序排列,剩下的n 1個數與第乙個數比較,再進行排序 有兩層迴圈,第一層控制排序的趟數,第二層控制每一趟比較的個數 include using namespace std int main for int i 0 i 10 i cin a i...

快速排序 快排 C語言

介紹 include 快速排序的函式 第乙個引數為要排序的陣列,第二個引數是參與排序的起始位置,第三個引數是引數排序的截止位置 void quicksort int arr int low,int height 找到陣列下標為第二個引數的值 在 公升序中應該在的 位置 下標 intfindpost ...

排序練習 (C語言)和快排

目錄 排序練習 快速排序演算法 給出乙個陣列,奇數序號降序,偶數序號公升序,要求重排成重小到大的陣列,時間複雜度為o n include sort.h 給出乙個陣列,奇數序號降序,偶數序號公升序,要求重排成重小到大的陣列,時間複雜度為o n void main int lenth 7 int b 1...