#include?stdlib.h
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供武川企業(yè)網(wǎng)站建設(shè),專注與做網(wǎng)站、網(wǎng)站設(shè)計(jì)、H5技術(shù)、小程序制作等業(yè)務(wù)。10年已為武川眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。
#include?stdio.h
#define?MAXN?8
#define?MOD?1024
void?QuickSort(int?*arr,?int?low,?int?high)
{
if?(low?=?high)?return;
//保存排序區(qū)間的?起始位置和終點(diǎn)位置
int?left?=?low,?right?=?high;
//默認(rèn)?左邊第一個(gè)元素?為標(biāo)志
int?key?=?arr[low];
while?(low??high)
{
while?(low??high??arr[high]?=?key)?--high;
arr[low]?=?arr[high];
while?(low??high??arr[low]?=?key)?++low;
arr[high]?=?arr[low];
}
arr[low]?=?key;
//每次排序后都分成兩部分[left,?low)?(low,?right]
//arr[low]的位置是一定是有序的
QuickSort(arr,?left,?low?-?1);
QuickSort(arr,?low?+?1,?right);
return;
}
int?main(void)
{
int?n;
scanf("%d",?n);
int?arr[MAXN]?=?{0};
int?i;
for?(i?=?0;?i??n;?++i)
scanf("%d",?arr[i]);
//輸入是默認(rèn)為生活中習(xí)慣的數(shù)組左邊第一個(gè)為:編號(hào)1
int?s,?m;
scanf("%d?%d",?s,?m);
//轉(zhuǎn)成計(jì)算機(jī)數(shù)組第一個(gè)為:編號(hào)0
s--;?m--;
//快排
QuickSort(arr,?s,?m);
//輸出
for?(i?=?s;?i?=?m;?++i)
{
printf("%d?",?arr[i]);
}
return?0;
}
//測試數(shù)據(jù)
//8
//1?2?3?4?5?6?7?8
//2?6
輸出 6 5 4 3 2
#include
iostream.h
int
data[9]
=
{54,38,96,23,15,72,60,45,83};virus
51cto技術(shù)博客
void
quick_sort(int
data[],
int
low,
int
high){virus
51cto技術(shù)博客
int
i,
j,
pivot;virus
51cto技術(shù)博客
if
(low
high)virus
51cto技術(shù)博客
{virus
51cto技術(shù)博客
pivot=data[low];virus
51cto技術(shù)博客
i=low;
virus
51cto技術(shù)博客
j=high;virus
51cto技術(shù)博客
virus
51cto技術(shù)博客
while(ij)virus
51cto技術(shù)博客
{virus
51cto技術(shù)博客
while
(ij
data[j]=pivot)virus
51cto技術(shù)博客
j--;virus
51cto技術(shù)博客
if(ij)virus
51cto技術(shù)博客
data[i++]=data[j];
//將比樞軸記錄小的記錄移到低端virus
51cto技術(shù)博客
virus
51cto技術(shù)博客
while
(ij
data[i]=pivot)virus
51cto技術(shù)博客
i++;virus
51cto技術(shù)博客
if(ij)
virus
51cto技術(shù)博客
data[j--]=data[i];
//將比樞軸記錄大的記錄移到高端virus
51cto技術(shù)博客
}virus
51cto技術(shù)博客
virus
51cto技術(shù)博客
data[i]=pivot;
//樞軸記錄移到最終位置virus
51cto技術(shù)博客
virus
51cto技術(shù)博客
quick_sort(data,low,i-1);virus
51cto技術(shù)博客
quick_sort(data,i+1,high);virus
51cto技術(shù)博客
}virus
51cto技術(shù)博客
}virus
51cto技術(shù)博客
virus
51cto技術(shù)博客
void
main()virus
51cto技術(shù)博客
{virus
51cto技術(shù)博客
quick_sort(data,
0,
8);virus
51cto技術(shù)博客
}virus
51cto技術(shù)博客
virus
51cto技術(shù)博客
下面是對(duì)這段程序的分析:virus
51cto技術(shù)博客
“pivot=data[low];”表示將最低端即第一個(gè)元素作為樞軸記錄,暫存到pivot中去,“while(ij)”表示當(dāng)高低指針相遇時(shí)循環(huán)終止,否則繼續(xù)?!皐hile
(ij
data[j]=pivot)
j--;”表示從高端(即數(shù)組后面)開始搜索,直到搜索到一個(gè)比樞軸值小的某個(gè)元素,條件“data[j]=pivot”用的是大于或等于號(hào),可見,在搜索過程中若遇到相等的則跳過并繼續(xù)搜索,條件“ij”不可少,因?yàn)樵谒阉鬟^程中,low與high可能相遇,此“ij”跟外層while的條件“ij”無關(guān),作用各不相同,外層while的條件“ij”是判斷在進(jìn)行從高端向低端搜索一趟、從低端向高端搜索一趟之后高低指針是否相遇,而前者卻是在單向的搜索過程中為防止高低指針相遇。virus
51cto技術(shù)博客
當(dāng)經(jīng)過“while
(ij
data[j]=pivot)
j--;”的搜索之后,搜索到一個(gè)比樞軸小的元素,因?yàn)樵谒阉魍曛骾、j可能相等,若相等,就沒有交換的必要,因此緊接下面設(shè)置了一個(gè)判斷“if(ij)”,若成立,那么就要將比樞軸記錄小的記錄移到低端“data[i++]=data[j];”,這里的“data[i++]”表示先使用了data[i]之后才加1,相當(dāng)于“data[i]=data[j];
i++;”兩句的效果。為什么要i++?是因?yàn)閯偨粨Q的記錄肯定比樞軸小,那么緊接下面的語句“while
(ij
data[i]=pivot)”就少了一次不必要的比較(因?yàn)椋篸ata[i]=pivot必定成立,而ij在前面的if語句中已成立,則“ij
data[i]=pivot”必成立,若沒有i++,while中的““ij
data[i]=pivot””在肯定成立的情況下執(zhí)行了一次),提高了效率。執(zhí)行“data[i++]=data[j];”之后,高端的data[j]覆蓋了data[i]的值,第一次覆蓋時(shí),覆蓋的是data[low]的值,因?yàn)樽铋_始時(shí),“pivot=data[low];”將最低端即第一個(gè)元素作為樞軸記錄暫存到pivot中去了,所以不必?fù)?dān)心,會(huì)丟失信息,由于data[j]的值賦給了data[i],那么data[j]原來的位置j就可以看做一個(gè)空白,下一次覆蓋時(shí),就將低端的data[i]復(fù)制到這個(gè)位置。virus
51cto技術(shù)博客
緊接下來的“while
(ij
data[i]=pivot)
i++;”是從低端向高端搜索,直到找到一個(gè)比樞軸大的元素,先進(jìn)行判斷“if(ij)”,若成立,如前所述,執(zhí)行“data[j--]=data[i];”就將低端的data[i]復(fù)制到上次賦值后空出的j位置。virus
51cto技術(shù)博客
如此反復(fù),直到外層while的條件不成立,即i==j,即高低指針相遇,表示已經(jīng)找到了樞軸記錄pivot的最終位置i,執(zhí)行“data[i]=pivot;”于是,樞軸記錄移到最終位置。接下來的“quick_sort(data,low,i-1);
quick_sort(data,i+1,high);”表示,對(duì)被pivot分開的左右子序列進(jìn)行遞歸的快速排序。virus
51cto技術(shù)博客
C語言中沒有預(yù)置的sort函數(shù)。如果在C語言中,遇到有調(diào)用sort函數(shù),就是自定義的一個(gè)函數(shù),功能一般用于排序。
一、可以編寫自己的sort函數(shù)。
如下函數(shù)為將整型數(shù)組從小到大排序。
void?sort(int?*a,?int?l)//a為數(shù)組地址,l為數(shù)組長度。
{
int?i,?j;
int?v;
//排序主體
for(i?=?0;?i??l?-?1;?i?++)
for(j?=?i+1;?j??l;?j?++)
{
if(a[i]??a[j])//如前面的比后面的大,則交換。
{
v?=?a[i];
a[i]?=?a[j];
a[j]?=?v;
}
}}
對(duì)于這樣的自定義sort函數(shù),可以按照定義的規(guī)范來調(diào)用。
二、C語言有自有的qsort函數(shù)。
功 能: 使用快速排序例程進(jìn)行排序
頭文件:stdlib.h
原型: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
參數(shù):
1 待排序數(shù)組首地址
2 數(shù)組中待排序元素?cái)?shù)量
3 各元素的占用空間大小
4 指向函數(shù)的指針,用于確定排序的順序
這個(gè)函數(shù)必須要自己寫比較函數(shù),即使要排序的元素是int,float一類的C語言基礎(chǔ)類型。
以下是qsort的一個(gè)例子:
#includestdio.h
#includestdlib.h
int?comp(const?void*a,const?void*b)//用來做比較的函數(shù)。
{
return?*(int*)a-*(int*)b;
}
int?main()
{
int?a[10]?=?{2,4,1,5,5,3,7,4,1,5};//亂序的數(shù)組。
int?i;
qsort(a,n,sizeof(int),comp);//調(diào)用qsort排序
for(i=0;i10;i++)//輸出排序后的數(shù)組
{
printf("%d\t",array[i]);
}
return?0;
}
擴(kuò)展資料:
sort函數(shù)的用法(C++排序庫函數(shù)的調(diào)用)
對(duì)數(shù)組進(jìn)行排序,在c++中有庫函數(shù)幫我們實(shí)現(xiàn),這們就不需要我們自己來編程進(jìn)行排序了。
(一)為什么要用c++標(biāo)準(zhǔn)庫里的排序函數(shù)
Sort()函數(shù)是c++一種排序方法之一,學(xué)會(huì)了這種方法也打消我學(xué)習(xí)c++以來使用的冒泡排序和選擇排序所帶來的執(zhí)行效率不高的問題!因?yàn)樗褂玫呐判蚍椒ㄊ穷愃朴诳炫诺姆椒?,時(shí)間復(fù)雜度為n*log2(n),執(zhí)行效率較高!
(二)c++標(biāo)準(zhǔn)庫里的排序函數(shù)的使用方法
I)Sort函數(shù)包含在頭文件為#includealgorithm的c++標(biāo)準(zhǔn)庫中,調(diào)用標(biāo)準(zhǔn)庫里的排序方法可以不必知道其內(nèi)部是如何實(shí)現(xiàn)的,只要出現(xiàn)我們想要的結(jié)果即可!
II)Sort函數(shù)有三個(gè)參數(shù):
(1)第一個(gè)是要排序的數(shù)組的起始地址。
(2)第二個(gè)是結(jié)束的地址(最后一位要排序的地址的下一地址)
(3)第三個(gè)參數(shù)是排序的方法,可以是從大到小也可是從小到大,還可以不寫第三個(gè)參數(shù),此時(shí)默認(rèn)的排序方法是從小到大排序。
Sort函數(shù)使用模板:
Sort(start,end,排序方法)
下面就具體使用sort()函數(shù)結(jié)合對(duì)數(shù)組里的十個(gè)數(shù)進(jìn)行排序做一個(gè)說明!
例一:sort函數(shù)沒有第三個(gè)參數(shù),實(shí)現(xiàn)的是從小到大
#includeiostream
#includealgorithm
using namespace std;
int main()
{
int a[10]={9,6,3,8,5,2,7,4,1,0};
for(int i=0;i10;i++)
couta[i]endl;
sort(a,a+11);
for(int i=0;i10;i++)
couta[i]endl;
return 0;
}
編譯器
GCC,GNU組織開發(fā)的開源免費(fèi)的編譯器
MinGW,Windows操作系統(tǒng)下的GCC
Clang,開源的BSD協(xié)議的基于LLVM的編譯器
Visual C++?:: cl.exe,Microsoft VC++自帶的編譯器
集成開發(fā)環(huán)境
CodeBlocks,開源免費(fèi)的C/C++ IDE
CodeLite,開源、跨平臺(tái)的C/C++集成開發(fā)環(huán)境
Orwell Dev-C++,可移植的C/C++IDE
C-Free
Light Table
Visual Studio系列
Hello World
參考資料:百度百科-sort函數(shù)