當前位置:首頁 » 編程語言 » c語言快速排序法講解
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言快速排序法講解

發布時間: 2022-10-06 08:27:57

⑴ 哪位大神能夠詳盡地解釋一下快速排序c語言演算法的原理,小白跪謝

https://zh.wikipedia.org/wiki/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F

⑵ C語言,快速排序演算法

你好!
首先0,n-1。應該是數組的坐標(因為n個數字。所以數組的坐標是0到n-1)
而a是你傳入的數組。所以他會根據數組的坐標到數組中找到元素。比較並進行排序。
遞歸這段理解如下:
首先要了解快速排序的思想:
1)隨意找一個基準數。將比基準小的都放到它左邊。比它大的都放到它右邊。所以當返回基準的坐標的時候。其實這個坐標左邊都是小於它的,右邊都是大於等於它的。(這里主要是看代碼的實現。圖中代碼是大於等於在右邊。也可以自己寫小於等於在左邊。這個不影響最後結果)
2)那麼第二次對於返回基準坐標的左右兩邊。我們同樣利用返回的基準坐標找到兩個「基準」(如下圖)。就會使得返回的這兩個基準左右兩邊有序
第三次用返回的兩個基準找到四個基準(如圖)
然後不斷遞歸..不斷的在整體有序的情況下使局部變的有序。
假設為532348789
第一次以a【0】5為基準。
則:


圖中紅色標識為基準元素最後會使得數組全局有序。
希望能對你有所幫助。

⑶ c語言怎樣實現快速排序

include<stdio.h>

int arr_num[];
int length;

void quick_sort(int left, int right)
{
int i, j, c, temp;
if(left>right)
return;

i= left;
j= right;
temp = arr_num[i]

while(i != j)
{
while(arr_num[j]>=temp && i<j)
{
j--;
}

while(arr_num[i]<=temp && i<j)
{
i++;
}

if(i<j)
{
c = arr_num[i];
arr_num[i] = arr_num[j];
arr_num[j] = c;
}
}

//left為起始值(參照值)此時的I為第一次排序結束的最後值,與參照值交換位置
arr_num[left] = arr_num[i];
arr_num[i] = temp;

//繼續遞歸直到排序完成
quick_sort(left, i-1);
quick_sort(i+1, right);
}

int main()
{
int i;
length = 7;
arr_num[length] = {23, 7, 17, 36, 3, 61, 49}

//快速排序調用
quick_sort(0, length-1);

//輸出排序後的結果
for(i=1;i<=length;i++)
printf("%d ",arr_num[i]);
getchar();getchar();
return 0;
}

⑷ c語言三種排序

常用的c語言排序演算法主要有三種即冒泡法排序、選擇法排序、插入法排序

一、冒泡排序冒泡排序:

是從第一個數開始,依次往後比較,在滿足判斷條件下進行交換。代碼實現(以降序排序為例)

#include<stdio.h>

int main()

{

int array[10] = { 6,9,7,8,5,3,4,0,1,2 };

int temp;

for (int i = 0; i < 10; i++)

{//循環次數

for (int j = 0; j <10 - i-1; j++)

{

if (array[j] < array[j+1])

{//前面一個數比後面的數大時發生交換 temp = array[j];

array[j] = array[j+1];

array[j + 1] = temp;

}

}

} //列印數組 for (int i = 0; i < 10; i++) printf("%2d", array[i]); return 0;}}

二、選擇排序以升序排序為例:

就是在指定下標的數組元素往後(指定下標的元素往往是從第一個元素開始,然後依次往後),找出除指定下標元素外的值與指定元素進行對比,滿足條件就進行交換。與冒泡排序的區別可以理解為冒泡排序是相鄰的兩個值對比,而選擇排序是遍歷數組,找出數組元素與指定的數組元素進行對比。(以升序為例)

#include<stdio.h>

int main()

{

int array[10] = { 6,9,7,8,5,3,4,0,1,2 };

int temp, index;

for (int i = 0; i < 9; i++) {

index = i;

for (int j = i; j < 10; j++)

{

if (array[j] < array[index])

index = j;

}

if(i != index)

{

temp = array[i];

array[i] = array[index];

array[index] = temp;

}

for(int i=0;i<10:i++)

printf("%2d"array[i])

return 0;

}

三、快速排序

是通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。

void QuickSort(int* arr, int size)

{

int temp, i, j;

for(i = 1; i <size; i++)

for(j=i; j>0; j--)

{

if(arr[j] <arr[j-1])

{

temp = arr[j];

arr[j]=arr[j-1];

arr[j-1]=temp;

}

}

}

⑸ C語言中快速排序法是怎麼用的,請給個例子進行說明

#include<stdio.h>
#include<stdlib.h>
intdata[]={12,30,15,17,19,22,26,33};
intmain()
{
inti,l=(sizeof(data)/sizeof(data[0]));
for(i=0;i<l;i++)printf("%d%c",data[i],(i<l-1)?32:10);

intcmp(constvoid*a,constvoid*b)
{
return(*(int*)a)-(*(int*)b);
}
qsort(data,l,sizeof(data[0]),cmp);

for(i=0;i<l;i++)printf("%d%c",data[i],(i<l-1)?32:10);
}

⑹ 用C語言編程實現快速排序演算法

給個快速排序你參考參考

/**********************快速排序****************************
基本思想:在待排序的n個記錄中任取一個記錄(通常取第一個記錄),
以該記錄為基準,將當前的無序區劃分為左右兩個較小的無
序子區,使左邊的記錄均小於基準值,右邊的記錄均大於或
等於基準值,基準值位於兩個無序區的中間位置(即該記錄
最終的排序位置)。之後,分別對兩個無序區進行上述的劃
分過程,直到無序區所有記錄都排序完畢。
*************************************************************/

/*************************************************************
函數名稱:staticvoidswap(int*a,int*b)
參數:int*a---整型指針
int*b---整型指針
功能:交換兩個整數的位置
返回值:無
說明:static關鍵字指明了該函數只能在本文件中使用
**************************************************************/
staticvoidswap(int*a,int*b)
{
inttemp=*a;
*a=*b;
*b=temp;
}

intquickSortNum=0;//快速排序演算法所需的趟數
/*************************************************************
函數名稱:staticintpartition(inta[],intlow,inthigh)
參數:inta[]---待排序的數據
intlow---無序區的下限值
inthigh---無序區的上限值
功能:完成一趟快速排序
返回值:基準值的最終排序位置
說明:static關鍵字指明了該函數只能在本文件中使用
**************************************************************/
staticintpartition(inta[],intlow,inthigh)
{
intprivotKey=a[low];//基準元素
while(low<high)
{//從表的兩端交替地向中間掃描
while(low<high&&a[high]>=privotKey)//找到第一個小於privotKey的值
high--;//從high所指位置向前搜索,至多到low+1位置
swap(&a[low],&a[high]);//將比基準元素小的交換到低端

while(low<high&&a[low]<=privotKey)//找到第一個大於privotKey的值
low++;//從low所指位置向後搜索,至多到high-1位置
swap(&a[low],&a[high]);//將比基準元素大的交換到高端
}
quickSortNum++;//快速排序趟數加1
returnlow;//返回基準值所在的位置
}

/*************************************************************
函數名稱:voidQuickSort(inta[],intlow,inthigh)
參數:inta[]---待排序的數據
intlow---無序區的下限值
inthigh---無序區的上限值
功能:完成快速排序演算法,並將排序完成的數據存放在數組a中
返回值:無
說明:使用遞歸方式完成
**************************************************************/
voidQuickSort(inta[],intlow,inthigh)
{
if(low<high)
{
intprivotLoc=partition(a,low,high);//將表一分為二
QuickSort(a,low,privotLoc-1);//遞歸對低子表遞歸排序
QuickSort(a,privotLoc+1,high);//遞歸對高子表遞歸排序
}
}

⑺ 菜鳥求教C語言快速排序法

你的整個main函數,其實只是把小於m的數放在了左邊,大於m的數放在了右邊。
只是比較了一趟。這是最大的問題。
然後你應該把0到mid跟mid到99之間再進行快排,這樣遞歸下去,才能算是一個完整的排序。
推薦在網上查找一個完整的程序,你就會發現自己的問題了。

⑻ C語言的快速排序的演算法是什麼啊

快速排序(Quicksort)是對冒泡排序的一種改進。由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。 演算法過程設要排序的數組是A[0]……A[N-1],首先任意選取一個數據(通常選用第一個數據)作為關鍵數據,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。值得注意的是,快速排序不是一種穩定的排序演算法,也就是說,多個相同的值的相對位置也許會在演算法結束時產生變動。 一趟快速排序的演算法是: 1)設置兩個變數I、J,排序開始的時候:I=0,J=N-1; 2)以第一個數組元素作為關鍵數據,賦值給key,即 key=A[0]; 3)從J開始向前搜索,即由後開始向前搜索(J=J-1),找到第一個小於key的值A[J],並與key交換; 4)從I開始向後搜索,即由前開始向後搜索(I=I+1),找到第一個大於key的A[I],與key交換; 5)重復第3、4、5步,直到 I=J; (3,4步是在程序中沒找到時候j=j-1,i=i+1,直至找到為止。找到並交換的時候i, j指針位置不變。另外當i=j這過程一定正好是i+或j-完成的最後另循環結束。) 例如:待排序的數組A的值分別是:(初始關鍵數據:X=49) 注意關鍵X永遠不變,永遠是和X進行比較,無論在什麼位子,最後的目的就是把X放在中間,小的放前面大的放後面。 A[0] A[1] A[2] A[3] A[4] A[5] A[6]: 49 38 65 97 76 13 27 進行第一次交換後:27 38 65 97 76 13 49 ( 按照演算法的第三步從後面開始找) 進行第二次交換後:27 38 49 97 76 13 65 ( 按照演算法的第四步從前面開始找>X的值,65>49,兩者交換,此時:I=3 ) 進行第三次交換後:27 38 13 97 76 49 65 ( 按照演算法的第五步將又一次執行演算法的第三步從後開始找 進行第四次交換後:27 38 13 49 76 97 65 ( 按照演算法的第四步從前面開始找大於X的值,97>49,兩者交換,此時:I=4,J=6 ) 此時再執行第三步的時候就發現I=J,從而結束一趟快速排序,那麼經過一趟快速排序之後的結果是:27 38 13 49 76 97 65,即所有大於49的數全部在49的後面,所有小於49的數全部在49的前面。 快速排序就是遞歸調用此過程——在以49為中點分割這個數據序列,分別對前面一部分和後面一部分進行類似的快速排序,從而完成全部數據序列的快速排序,最後把此數據序列變成一個有序的序列,根據這種思想對於上述數組A的快速排序的全過程如圖6所示: 初始狀態 {49 38 65 97 76 13 27} 進行一次快速排序之後劃分為 {27 38 13} 49 {76 97 65} 分別對前後兩部分進行快速排序 {27 38 13} 經第三步和第四步交換後變成 {13 27 38} 完成排序。 {76 97 65} 經第三步和第四步交換後變成 {65 76 97} 完成排序。

⑼ 關於快速排序C語言演算法

//一點小問題而已,已為你改好
#include <stdio.h>
void Quick_sort (int s[], int l, int r )
{
if(l<r)
{
int i=l,j=r,x=s[l];
while(i<j)
{
while(i<j&&s[j]>=x)
{j--;}//從右向左找第一個小於x的數
if(i<j)
{s[i++]=s[j];}
while(i<j&&s[i]<=x)
{i++;}//從左到右找第一個大於等於x的數
if(i<j)
{s[j--]=s[i];}
}
s[i]=x;
Quick_sort(s,l,i-1);//遞歸
Quick_sort(s,i+1,r);
}
}
int main()
{
int arr[7] = { 1,9,7,6,5,35,15 };
int i;
printf("之前的數組:");
for (i = 0; i < 7; i++) printf("%3d", arr[i]);
printf("\n");
Quick_sort(arr, 0, 6);
printf("排序之後的數組:");
for (i = 0; i < 7; i++) printf("%3d", arr[i]);
printf("\n");
return 0;
}

⑽ c語言快速排序

Partition

i=p-1;
句,你的p第一次是0

這是從網上找的例子:
void QuickSort(int a[],int numsize)//a是整形數組,numsize是元素個數

{

int i=0,j=numsize-1;

int val=a[0];//指定參考值val大小

if(numsize>1)//確保數組長度至少為2,否則無需排序

{

while(i<j)//循環結束條件

{

for(;j>i;j--)//從後向前搜索比val小的元素,找到後填到a[i]中並跳出循環

if(a[j]<val)

{

a[i]=a[j];

break;

}

for(;i<j;i++)//從前往後搜索比val大的元素,找到後填到a[j]中並跳出循環

if(a[i]>val)

{

a[j]=a[i];

break;

}

}

a[i]=val;//將保存在val中的數放到a[i]中

QuickSort(a,i);//遞歸,對前i個數排序

QuickSort(a+i+1,numsize-1-i);//對i+1到numsize這numsize-1-i個數排序

}

for (int aaa = 0; aaa < 10; aaa++) {

printf("%d\n\n", a[aaa]);

}

}
int main(int argc, const char * argv[])

{

int i = 0;

int array[10]={24,8,1,44,13,34,11,64,23,98};

QuickSort(array,10);

return 0;

}