❶ c語言快速排序
俺博客裡面有啦,參考自己寫的,不好請指教:
http://hi..com/djpangxie/blog/item/572cc9d0ee5546da562c8414.html
❷ C語言,快速排序演算法
你好!
首先0,n-1。應該是數組的坐標(因為n個數字。所以數組的坐標是0到n-1)
而a是你傳入的數組。所以他會根據數組的坐標到數組中找到元素。比較並進行排序。
遞歸這段理解如下:
首先要了解快速排序的思想:
1)隨意找一個基準數。將比基準小的都放到它左邊。比它大的都放到它右邊。所以當返回基準的坐標的時候。其實這個坐標左邊都是小於它的,右邊都是大於等於它的。(這里主要是看代碼的實現。圖中代碼是大於等於在右邊。也可以自己寫小於等於在左邊。這個不影響最後結果)
2)那麼第二次對於返回基準坐標的左右兩邊。我們同樣利用返回的基準坐標找到兩個「基準」(如下圖)。就會使得返回的這兩個基準左右兩邊有序
第三次用返回的兩個基準找到四個基準(如圖)
然後不斷遞歸..不斷的在整體有序的情況下使局部變的有序。
假設為532348789
第一次以a【0】5為基準。
則:
圖中紅色標識為基準元素最後會使得數組全局有序。
希望能對你有所幫助。
❸ c語言中排序方法
1、冒泡排序(最常用)
冒泡排序是最簡單的排序方法:原理是:從左到右,相鄰元素進行比較。每次比較一輪,就會找到序列中最大的一個或最小的一個。這個數就會從序列的最右邊冒出來。(注意每一輪都是從a[0]開始比較的)
以從小到大排序為例,第一輪比較後,所有數中最大的那個數就會浮到最右邊;第二輪比較後,所有數中第二大的那個數就會浮到倒數第二個位置……就這樣一輪一輪地比較,最後實現從小到大排序。
2、雞尾酒排序
雞尾酒排序又稱雙向冒泡排序、雞尾酒攪拌排序、攪拌排序、漣漪排序、來回排序或快樂小時排序, 是冒泡排序的一種變形。該演算法與冒泡排序的不同處在於排序時是以雙向在序列中進行排序。
原理:數組中的數字本是無規律的排放,先找到最小的數字,把他放到第一位,然後找到最大的數字放到最後一位。然後再找到第二小的數字放到第二位,再找到第二大的數字放到倒數第二位。以此類推,直到完成排序。
3、選擇排序
思路是設有10個元素a[1]-a[10],將a[1]與a[2]-a[10]比較,若a[1]比a[2]-a[10]都小,則不進行交換。若a[2]-a[10]中有一個以上比a[1]小,則將其中最大的一個與a[1]交換,此時a[1]就存放了10個數中最小的一個。同理,第二輪拿a[2]與a[3]-a[10]比較,a[2]存放a[2]-a[10]中最小的數,以此類推。
4、插入排序
插入排序是在一個已經有序的小序列的基礎上,一次插入一個元素*
一般來說,插入排序都採用in-place在數組上實現。
具體演算法描述如下:
⒈ 從第一個元素開始,該元素可以認為已經被排序
⒉ 取出下一個元素,在已經排序的元素序列中從後向前掃描
⒊ 如果該元素(已排序)大於新元素,將該元素移到下一位置
⒋ 重復步驟3,直到找到已排序的元素小於或者等於新元素的位置
⒌ 將新元素插入到下一位置中
⒍ 重復步驟2~5
❹ 數據結構(c語言)中快速排序什麼時候排序最慢,什麼情況下使用快速排序
當待排序的序列已經有序(不管是升序還是降序),此時快速排序最慢,一般當數據量很大的時候,用快速排序比較好,為了避免原來的序列有序,一般採用改進的快速排序演算法,在排序之前隨機交換兩個元素的位置,就可以達到目的了,有一本書,叫《演算法設計、分析與實現:C、C++和java》徐子珊著。可以看看,裡面寫了很多基本的演算法
❺ C語言的快速排序的演算法是什麼啊
就是一種演算法,
演算法的時間復雜度為
nlgn。
是一種排序速度很快的演算法,
同時也是不穩定排序演算法!
❻ 快速排序演算法c語言
quick明顯有問題,1.存在死循環2.使用遞歸是想實現什麼?
如果想實現快速排序的話可以參考一下程序段,盡量精簡交換操作增加排序速度:
voidquick(int*arr,intlen)
{
inti,j,k,z;
for(i=0;i<len-1;i++)
{
for(j=0,k=0;j<len-i-1;j++)
{
if(arr[k]<arr[j+1])
k=j+1;
}
if(k!=len-i-1)
{
z=arr[len-i-1];
arr[len-i-1]=arr[k];
arr[k]=z;
}
}
}
❼ C語言中的一趟快速排序問題
第一,你main裡面,把一個沒有分配內容的指針L拿來直接用就錯了。
第二,quicksort是分而治之,是逐層分。每次partition之後,分成兩部分,一邊比哨兵小,一邊比哨兵大。應該對於這兩部分分別繼續quicksort。遞歸的做。你只partition了一次,所以,這一次能不能正好排對就靠運氣了。
我給你改了一下,你看看對不對。
#include<stdio.h>
#defineMAXSIZE1000
typedefstruct
{
intr[MAXSIZE+1];
intlength;
}SqList;
voidswap(SqList*L,inti,intj)
{
inttemp=L->r[i];
L->r[i]=L->r[j];
L->r[j]=temp;
}
intPartition(SqList*L,intlow,inthigh)
{
intpivotkey;
pivotkey=L->r[low];
while(low<high)
{
while(low<high&&L->r[high]>=pivotkey)
high--;
swap(L,low,high);
while(low<high&&L->r[low]<=pivotkey)
low++;
swap(L,low,high);
}
returnlow;
}
voidQuickSort(SqList*L,intlow,inthigh){
intkey=Partition(L,low,high);
if(key>low+1)
QuickSort(L,low,key-1);
if(key<high-1)
QuickSort(L,key+1,high);
}
intmain()
{
SqListL;
inti,j;
intlow=0,high;
printf("請輸入排序個數:");
scanf("%d",&i);
high=i-1;
printf("請輸入元素:");
for(j=0;j<i;j++)
{
scanf("%d",&L.r[j]);
}
QuickSort(&L,low,high);
for(j=0;j<i;j++)
{
printf("%d",L.r[j]);
}
}
❽ C語言快速排序代碼
採用快速排序,用遞歸實現
#include <stdio.h>
#define N 10 //定義排序數組元素個數
int Qsort(int start,int length,int a[])//start排序的起始,length是要排序序列長度
{
int x = a[start];
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語言快速排序
排序快慢得看你提供了多少數據,因為數據量的不同,選擇最快的方法也不同。
❿ 用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);//遞歸對高子表遞歸排序
}
}