本文目錄一覽:
C語言中快速排序法的原理及應用
“快速排序法”使用的是遞歸原理,下面我結合一個例子來說明“快速排序法”的原理。首先給出一個數組{53,12,98,63,18,72,80,46, 32,21},先找到第一個數–53,把它作為中間值,也就是說,要把53放在一個位置,使得它左邊的值比它小,右邊的值比它大。{21,12,32, 46,18,53,80,72,63,98},這樣一個數組的排序就變成了兩個小數組的排序–53左邊的數組和53右邊的數組,而這兩個數組繼續用同樣的方式繼續下去,一直到順序完全正確。
一般來說,冒泡法是程序員最先接觸的排序方法,它的優點是原理簡單,編程實現容易,但它的缺點就是–程序的大忌–速度太慢。
附上快速排序代碼:
#includestdio.h
void quicksort(int a[],int left,int right)
{
int i,j,temp;
i=left;
j=right;
temp=a[left];
if(leftright)
return;
while(i!=j)
{
while(a[j]=tempji)
j–;
if(ji)
a[i++]=a[j];
while(a[i]=tempji)
i++;
if(ji)
a[j–]=a[i];
}
a[i]=temp;
quicksort(a,left,i-1);
quicksort(a,i+1,right);
}
void main()
{
int a[]={53,12,98,63,18,72,80,46,32,21};
int i;
quicksort(a,0,9);
/*排好序的結果*/
for(i=0;i10;i++)
printf(“%4d\n”,a[i]);
}
關於快速排序C語言算法
//一點小問題而已,已為你改好
#include stdio.h
void Quick_sort (int s[], int l, int r )
{
if(lr)
{
int i=l,j=r,x=s[l];
while(ij)
{
while(ijs[j]=x)
{j–;}//從右向左找第一個小於x的數
if(ij)
{s[i++]=s[j];}
while(ijs[i]=x)
{i++;}//從左到右找第一個大於等於x的數
if(ij)
{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語言怎樣實現快速排序
includestdio.h
int arr_num[];
int length;
void quick_sort(int left, int right)
{
int i, j, c, temp;
if(leftright)
return;
i= left;
j= right;
temp = arr_num[i]
while(i != j)
{
while(arr_num[j]=temp ij)
{
j–;
}
while(arr_num[i]=temp ij)
{
i++;
}
if(ij)
{
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語言快速排序代碼
採用快速排序,用遞歸實現
#include stdio.h
#define N 10 //定義排序數組元素個數
int Qsort(int start,int length,int a[])//start排序的起始,length是要排序序列長度
{
int x = a;
int i,j;
i = start;
j = length -1;
while(i j)
{
if(x a[j])
j–;
else if(x a[j])
{
a[i] = a[j];
a[j] = x;
i++;
}
else if(x a[i])
{
a[j] = a[i];
a[i] = x;
j–;
}
else
i++;
}
if(start length-1)
{
Qsort(start,i,a);
Qsort(i+1,length,a);
}
}
void main()
{
int a[N] = {0};
int i;
for(i = 0;i N;i++)
scanf(“%d”,a[i]);
Qsort(0,N,a);
for(i = 0;i N;i++)
printf(“%d “,a[i]);
}
程序執行時輸入N個數,對這N個數進行排序,可以預設N的長度
誰有快速排序的C語言實現啊
#include stdio.h
typedef int InfoType;
#define n 10 //假設的文件長度,即待排序的記錄數目
typedef int KeyType; //假設的關鍵字類型
typedef struct { //記錄類型
KeyType key; //關鍵字項
InfoType otherinfo; //其它數據項,類型InfoType依賴於具體應用而定義
} RecType;
typedef RecType SeqList[n+1]; //SeqList為順序表類型,表中第0個單元一般用作哨兵
int Partition(SeqList R,int i,int j);
void main()
{
void QuickSort(SeqList R,int low,int high);
int i;
SeqList R;
printf(“請輸入欲排序的10個數:”);
for (i=1;i=n;i++)
scanf(“%d”,R[i].key);
printf(“排序前:”);
for (i=1;i=n;i++)
printf(“%d “,R[i].key);
printf(“\n”);
QuickSort(R,1,n);
printf(“排序後:”);
for (i=1;i=n;i++)
printf(“%d “,R[i].key);
printf(“\n”);
}
void QuickSort(SeqList R,int low,int high)
{ //對R[low..high]快速排序
int pivotpos; //劃分後的基準記錄的位置
if(lowhigh){ //僅當區間長度大於1時才須排序
pivotpos=Partition(R,low,high); //對R[low..high]做劃分
QuickSort(R,low,pivotpos-1); //對左區間遞歸排序
QuickSort(R,pivotpos+1,high); //對右區間遞歸排序
}
}
int Partition(SeqList R,int i,int j)
{//調用Partition(R,low,high)時,對R[low..high]做劃分,並返回基準記錄的位置
RecType pivot=R[i]; //用區間的第1個記錄作為基準
while(ij){ //用區間兩端交替向中間掃描,直至i=j為止
while(ij R[j].key=pivot.key) //pivot相當於在位置i上
j–; //從右向左掃描,查找第1個關鍵字小於pivot.key的記錄R[j]
if(ij) //表示找到的R[j]的關鍵字pivot.key
R[i++]=R[j]; //相當於交換R[i]和R[j],交換後i指針加1
while(ij R[i].key=pivot.key) //pivot相當於在位置j上
i++; //從左向右掃描,查找第1個關鍵字大於pivot.key的記錄R[i]
if(ij) //表示找到了R[i],使R[i].keypivot.key
R[j–]=R[i]; //相當於交換R[i]和R[j],交換後j指針減1
}
R[i]=pivot; //基準記錄已被最後定位
return i;
}
用C語言編程實現快速排序算法
給個快速排序你參考參考
/********************** 快速排序 ****************************
基本思想:在待排序的n個記錄中任取一個記錄(通常取第一個記錄),
以該記錄為基準,將當前的無序區劃分為左右兩個較小的無
序子區,使左邊的記錄均小於基準值,右邊的記錄均大於或
等於基準值,基準值位於兩個無序區的中間位置(即該記錄
最終的排序位置)。之後,分別對兩個無序區進行上述的劃
分過程,直到無序區所有記錄都排序完畢。
*************************************************************/
/*************************************************************
函數名稱:static void swap(int *a, int *b)
參 數:int *a—整型指針
int *b—整型指針
功 能:交換兩個整數的位置
返 回 值:無
說 明:static關鍵字指明了該函數只能在本文件中使用
**************************************************************/
static void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int quickSortNum = 0; // 快速排序算法所需的趟數
/*************************************************************
函數名稱:static int partition(int a[], int low, int high)
參 數:int a[]—待排序的數據
int low—無序區的下限值
int high—無序區的上限值
功 能:完成一趟快速排序
返 回 值:基準值的最終排序位置
說 明:static關鍵字指明了該函數只能在本文件中使用
**************************************************************/
static int partition(int a[], int low, int high)
{
int privotKey = 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
return low; // 返回基準值所在的位置
}
/*************************************************************
函數名稱:void QuickSort(int a[], int low, int high)
參 數:int a[]—待排序的數據
int low—無序區的下限值
int high—無序區的上限值
功 能:完成快速排序算法,並將排序完成的數據存放在數組a中
返 回 值:無
說 明:使用遞歸方式完成
**************************************************************/
void QuickSort(int a[], int low, int high)
{
if(low high)
{
int privotLoc = partition(a, low, high); // 將表一分為二
QuickSort(a, low, privotLoc-1); // 遞歸對低子表遞歸排序
QuickSort(a, privotLoc+1, high); // 遞歸對高子表遞歸排序
}
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/189500.html