關於快排的一些小問題
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...