A. 用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);//遞歸對高子表遞歸排序
}
}
B. 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即j--),找到第一個小於key的值A[j]
4)從i開始向後搜索,即由前開始向後搜索(i=i+1即i++),找到第一個大於key的A[i],A[i]與A[j]交換;
5)重復第3、4、5步,直到 I=J; (3,4步是在程序中沒找到時候j=j-1,i=i+1,直至找到為止。找到並交換的時候i, j指針位置不變。另外當i=j這過程一定正好是i+或j-完成的最後令循環結束。)
C. C語言,快速排序演算法
你好!
首先0,n-1。應該是數組的坐標(因為n個數字。所以數組的坐標是0到n-1)
而a是你傳入的數組。所以他會根據數組的坐標到數組中找到元素。比較並進行排序。
遞歸這段理解如下:
首先要了解快速排序的思想:
1)隨意找一個基準數。將比基準小的都放到它左邊。比它大的都放到它右邊。所以當返回基準的坐標的時候。其實這個坐標左邊都是小於它的,右邊都是大於等於它的。(這里主要是看代碼的實現。圖中代碼是大於等於在右邊。也可以自己寫小於等於在左邊。這個不影響最後結果)
2)那麼第二次對於返回基準坐標的左右兩邊。我們同樣利用返回的基準坐標找到兩個「基準」(如下圖)。就會使得返回的這兩個基準左右兩邊有序
第三次用返回的兩個基準找到四個基準(如圖)
然後不斷遞歸..不斷的在整體有序的情況下使局部變的有序。
假設為532348789
第一次以a【0】5為基準。
則:
圖中紅色標識為基準元素最後會使得數組全局有序。
希望能對你有所幫助。
D. 關於c語言幾種排序方法的理解
關於對於 C 語言通常使用的幾種排序演算法(冒泡排序、堆排序、SHELL排序、快速排序、歸並排序等)的深入理解:哪一個排序演算法的執行效率最高、每一種排序演算法所佔用的系統空間、以及執行時間等,這個必須要通過學習計算機軟體專業中的專業課程:計算機演算法設計與分析,才能夠做到這一點的。
否則的話,只能夠按照數據結構(C語言版)中給出的 C 語言源代碼進行普通的編程實現代碼而已。而無法從計算機理論的角度上深入理解 C 語言中的幾種排序演算法。
E. c語言中的排序演算法
快速排序,冒泡排序,選擇排序,歸並排序,堆排序,桶排序。。。。。。
舉例兩個。。。選擇排序:
for(int i = 1 ; i < n ; i++)
for(int j = i + 1 ; j <= n ; j++)
if(a[i] < a[j]) //要想反序就把小於號改成大於號
swap(a[i], a[j]);
快速排序,只能用函數了。。。:
void qsort(int a[], int p, int q)
{
int x = p - 1;
for(int i = p ; i < q ; i++)
if(a[i] > a[q]) //反序和選擇排序一樣
swap(a[++x], a[i]);
swap(a[++x], a[q]);
if(x - 1 > p)
qsort(a, p, x - 1);
if(x + 1 > q)
qsort(a, x + 1, q);
}
F. 程序設計中有哪些排序演算法用C語言分別怎樣實現
冒泡排序法,折半查找法。折半是有一定的順序的中找,利用折半減少查找次數。
、沒優化的冒泡我就不說了,優化的說是拿第一個元素跟後面的一個個比較,大的或小的放到第一個,這樣第一次比較出來的就是最大的或最小的,然後第二個在跟後面的元素一個個比較,找出第二大或第二小,依此到完,用到二個FOR循環。
G. 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;
}
}
}
H. c語言考試。問數組,常見的數組排序演算法有那幾種選擇一個描述過程。
有插入排序:直接插入排序、折半插入排序、希爾排序;交換排序:冒泡排序、快速排序;選擇排序:簡單選擇排序、堆排序;歸並排序;基數排序。
常用冒泡排序的基本概念是:依次比較相鄰的兩個數,將小數放在前面,大數放在後面(數組由小到大排序)。即首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後,此時第一趟結束,在最後的數必是所有數中的最大數。重復以上過程,仍從第一對數開始比較(因為可能由於第2個數和第3個數的交換,使得第1個數不再小於第2個數),將小數放前,大數放後,一直比較到最大數前的一對相鄰數,將小數放前,大數放後,第二趟結束,在倒數第二個數中得到一個新的最大數。如此下去,直至最終完成排序。
由於在排序過程中總是小數往前放,大數往後放,相當於氣泡往上升,所以稱作冒泡排序。
用二重循環實現,外循環變數設為i,內循環變數設為j。外循環重復9次,內循環依次重復9,8,...,1次。每次進行比較的兩個元素都是與內循環j有關的,它們可以分別用a[j]和a[j+1]標識,i的值依次為1,2,...,9,對於每一個i,
j的值依次為1,2,...10-i。
代碼:
for(i=0;
i<NUM-1;
i++)
/*外循環:控制比較趟數*/
for(j=NUM-1;
j>i;
j--)
/*內循環:進行每趟比較*/
if(data[j]<data[j-1])
/*如果data[j]大於data[j-1],交換兩者的位置*/
{temp=data[j];
data[j]=data[j-1];
data[j-1]=temp;
};
I. c語言排序演算法
#include<stdio.h>
#defineN100000//定義最多輸入的數據
intsort(int*a,intn){
inti,j,m;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(a[i]>a[j]){
m=a[i];a[i]=a[j];a[j]=m;
}
return0;
}
intmain(){
inta[N];
inti=0,n,ii;
while(1){
//printf("輸入n ");
scanf("%d",&n);
a[i++]=n;
if(n==0)break;
ii=i;
for(;i<n+ii;i++)
scanf("%d",&a[i]);
}
i=0;
while(a[i]!=0){
sort(a+i+1,a[i]);
for(n=1;n<=a[i];n++)
printf("%d",a[i+n]);
printf(" ");
i=i+a[i]+1;
}
}
J. 使用C語言編程實現排序演算法
#include<stdio.h>
main()
{
struct
{
char mz[5];
int sd;
char sbing[5];
int xs;
}a[100],k;
int i,b,j;
printf("請輸進球員數量\n");
scanf("%d",&b);
for(i=0;i<b;i++)
{printf("請輸入第%d個球員的信息\n",i+1);
printf("名字:"); scanf("%s",a[i].mz);
printf("速度(數字):"); scanf("%d",&a[i].sd);
printf("傷病情況:"); scanf("%s",a[i].sbing);
printf("薪水(數字:"); scanf("%d",&a[i].xs);}
for(j=0;j<b;j++)
for(i=j+1;i<b;i++)
if(a[j].sd<a[i].sd)
{ k=a[i];
a[i]=a[j];
a[j]=k;}
if(a[j].sd==a[i].sd)
if (a[j].xs>a[i].xs)
{ k=a[i];
a[i]=a[j];
a[j]=k;}
for(j=0;j<b;j++)
printf("名字:%s 速度: %d 傷病: %s 薪水: %d\n",a[j].mz,a[j].sd,a[j].sbing,a[j].xs);
}
如有不滿請回復