給個(gè)快速排序你參考參考
我們提供的服務(wù)有:網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、歙縣ssl等。為成百上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的歙縣網(wǎng)站制作公司
/**********************?快速排序?****************************
基本思想:在待排序的n個(gè)記錄中任取一個(gè)記錄(通常取第一個(gè)記錄),
??以該記錄為基準(zhǔn),將當(dāng)前的無序區(qū)劃分為左右兩個(gè)較小的無
??序子區(qū),使左邊的記錄均小于基準(zhǔn)值,右邊的記錄均大于或
??等于基準(zhǔn)值,基準(zhǔn)值位于兩個(gè)無序區(qū)的中間位置(即該記錄
??最終的排序位置)。之后,分別對(duì)兩個(gè)無序區(qū)進(jìn)行上述的劃
??分過程,直到無序區(qū)所有記錄都排序完畢。
*************************************************************/
/*************************************************************
函數(shù)名稱:static?void?swap(int?*a,?int?*b)
參????數(shù):int?*a---整型指針
??int?*b---整型指針
功????能:交換兩個(gè)整數(shù)的位置
返?回?值:無
說????明:static關(guān)鍵字指明了該函數(shù)只能在本文件中使用
**************************************************************/
static?void?swap(int?*a,?int?*b)
{??
int?temp?=?*a;
*a?=?*b;
*b?=?temp;
}
int?quickSortNum?=?0;?//?快速排序算法所需的趟數(shù)
/*************************************************************
函數(shù)名稱:static?int?partition(int?a[],?int?low,?int?high)
參????數(shù):int?a[]---待排序的數(shù)據(jù)
??int?low---無序區(qū)的下限值
??int?high---無序區(qū)的上限值
功????能:完成一趟快速排序
返?回?值:基準(zhǔn)值的最終排序位置
說????明:static關(guān)鍵字指明了該函數(shù)只能在本文件中使用
**************************************************************/
static?int?partition(int?a[],?int?low,?int?high)
{
int?privotKey?=?a[low];??//基準(zhǔn)元素
while(low??high)
{???//從表的兩端交替地向中間掃描??
while(low??high???a[high]?=?privotKey)???//?找到第一個(gè)小于privotKey的值
high--;??//從high所指位置向前搜索,至多到low+1位置??
swap(a[low],?a[high]);??//?將比基準(zhǔn)元素小的交換到低端
while(low??high???a[low]?=?privotKey)???//?找到第一個(gè)大于privotKey的值
low++;??//從low所指位置向后搜索,至多到high-1位置
swap(a[low],?a[high]);??//?將比基準(zhǔn)元素大的交換到高端
}
quickSortNum++;??//?快速排序趟數(shù)加1
return?low;??//?返回基準(zhǔn)值所在的位置
}??
/*************************************************************
函數(shù)名稱:void?QuickSort(int?a[],?int?low,?int?high)
參????數(shù):int?a[]---待排序的數(shù)據(jù)
??int?low---無序區(qū)的下限值
??int?high---無序區(qū)的上限值
功????能:完成快速排序算法,并將排序完成的數(shù)據(jù)存放在數(shù)組a中
返?回?值:無
說????明:使用遞歸方式完成
**************************************************************/
void?QuickSort(int?a[],?int?low,?int?high)
{??
if(low??high)
{
int?privotLoc?=?partition(a,?low,?high);?//?將表一分為二??
QuickSort(a,?low,?privotLoc-1);??????????//?遞歸對(duì)低子表遞歸排序??
QuickSort(a,?privotLoc+1,?high);?????????//?遞歸對(duì)高子表遞歸排序??
}
}
1、冒泡排序(最常用)
冒泡排序是最簡(jiǎn)單的排序方法:原理是:從左到右,相鄰元素進(jìn)行比較。每次比較一輪,就會(huì)找到序列中最大的一個(gè)或最小的一個(gè)。這個(gè)數(shù)就會(huì)從序列的最右邊冒出來。(注意每一輪都是從a[0]開始比較的)
以從小到大排序?yàn)槔谝惠啽容^后,所有數(shù)中最大的那個(gè)數(shù)就會(huì)浮到最右邊;第二輪比較后,所有數(shù)中第二大的那個(gè)數(shù)就會(huì)浮到倒數(shù)第二個(gè)位置……就這樣一輪一輪地比較,最后實(shí)現(xiàn)從小到大排序。
2、雞尾酒排序
雞尾酒排序又稱雙向冒泡排序、雞尾酒攪拌排序、攪拌排序、漣漪排序、來回排序或快樂小時(shí)排序, 是冒泡排序的一種變形。該算法與冒泡排序的不同處在于排序時(shí)是以雙向在序列中進(jìn)行排序。
原理:數(shù)組中的數(shù)字本是無規(guī)律的排放,先找到最小的數(shù)字,把他放到第一位,然后找到最大的數(shù)字放到最后一位。然后再找到第二小的數(shù)字放到第二位,再找到第二大的數(shù)字放到倒數(shù)第二位。以此類推,直到完成排序。
3、選擇排序
思路是設(shè)有10個(gè)元素a[1]-a[10],將a[1]與a[2]-a[10]比較,若a[1]比a[2]-a[10]都小,則不進(jìn)行交換。若a[2]-a[10]中有一個(gè)以上比a[1]小,則將其中最大的一個(gè)與a[1]交換,此時(shí)a[1]就存放了10個(gè)數(shù)中最小的一個(gè)。同理,第二輪拿a[2]與a[3]-a[10]比較,a[2]存放a[2]-a[10]中最小的數(shù),以此類推。
4、插入排序
插入排序是在一個(gè)已經(jīng)有序的小序列的基礎(chǔ)上,一次插入一個(gè)元素*
一般來說,插入排序都采用in-place在數(shù)組上實(shí)現(xiàn)。
具體算法描述如下:
⒈ 從第一個(gè)元素開始,該元素可以認(rèn)為已經(jīng)被排序
⒉ 取出下一個(gè)元素,在已經(jīng)排序的元素序列中從后向前掃描
⒊ 如果該元素(已排序)大于新元素,將該元素移到下一位置
⒋ 重復(fù)步驟3,直到找到已排序的元素小于或者等于新元素的位置
⒌ 將新元素插入到下一位置中
⒍ 重復(fù)步驟2~5
#include?stdlib.h
#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;
}
//測(cè)試數(shù)據(jù)
//8
//1?2?3?4?5?6?7?8
//2?6
輸出 6 5 4 3 2
#include stdio.h
#includestdlib.h
#includestring.h
int comp(char *a,char *b)
{
while(*a==*b*a*b){a++;b++;}
return (int)*a-(int)*b;
}
int main(void)
{
char s[1000][20];
int i,n;
scanf("%d\n",n);
for(i=0;in;i++)
gets(s[i]);
qsort(s,n,sizeof(s[0]),comp);
printf("\n");
for(i=0;in;i++)
puts(s[i]);
system("pause");
return 0;
}
冒泡法排序函數(shù)如下:
void bubble(int a[],int n)
{int i,j,t;
for(i=0;in-1;i++)/*共進(jìn)行n-1輪*/
for(j=0;jn-1-i;j++)/*每輪在前n-i個(gè)數(shù)中比較*/
if(a[j]a[j+1]) /*若相鄰元素逆序*/
{t=a[j]; a[j]=a[j+1];a[j+1]=t;}/*就交換*/
}
void sort(int *a, int left, int right)
{
if(left = right)/*如果左邊索引大于或者等于右邊的索引就代表已經(jīng)整理完成一個(gè)組了*/
{
return ;
}
int i = left;
int j = right;
int key = a[left];
while(i j) /*控制在當(dāng)組內(nèi)尋找一遍*/
{
while(i j key = a[j])
/*而尋找結(jié)束的條件就是,1,找到一個(gè)小于或者大于key的數(shù)(大于或小于取決于你想升
序還是降序)2,沒有符合條件1的,并且i與j的大小沒有反轉(zhuǎn)*/
{
j--;/*向前尋找*/
}
a[i] = a[j];
/*找到一個(gè)這樣的數(shù)后就把它賦給前面的被拿走的i的值(如果第一次循環(huán)且key是
a[left],那么就是給key)*/
while(i j key = a[i])
/*這是i在當(dāng)組內(nèi)向前尋找,同上,不過注意與key的大小關(guān)系停止循環(huán)和上面相反,
因?yàn)榕判蛩枷胧前褦?shù)往兩邊扔,所以左右兩邊的數(shù)大小與key的關(guān)系相反*/
{
i++;
}
a[j] = a[i];
}
a[i] = key;/*當(dāng)在當(dāng)組內(nèi)找完一遍以后就把中間數(shù)key回歸*/
sort(a, left, i - 1);/*最后用同樣的方式對(duì)分出來的左邊的小組進(jìn)行同上的做法*/
sort(a, i + 1, right);/*用同樣的方式對(duì)分出來的右邊的小組進(jìn)行同上的做法*/
/*當(dāng)然最后可能會(huì)出現(xiàn)很多分左右,直到每一組的i = j 為止*/
}
函數(shù)kuaipai1 進(jìn)入了無限死循環(huán)。
遞歸函數(shù)沒有一個(gè)節(jié)點(diǎn)判定遞歸結(jié)束,導(dǎo)致進(jìn)入死循環(huán)
系統(tǒng)堆棧用完,程序崩潰。
程序調(diào)試報(bào)告有無限死循環(huán)危險(xiǎn),運(yùn)行后就直接崩潰,導(dǎo)致棧溢出。
標(biāo)題名稱:c語言中快速排序的函數(shù),c語言中快速排序的函數(shù)是
標(biāo)題鏈接:http://chinadenli.net/article34/hecspe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、網(wǎng)站排名、全網(wǎng)營銷推廣、網(wǎng)站制作、網(wǎng)站策劃、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)