快速排序 quick sort
基本思想:以乙個數為參照,把比它小的排左邊,比它大的排右邊(從小到大排序)
左邊找大於參照的,右邊找小於參照的,找到就彼此交換。 5
69110
8723
0 原順序 第乙個為參照 5
09110
8723
6 i從左第二個向右掃瞄 j從右掃瞄 符合條件就交換 5
03110
8729
6503
1287
10962
0315
87109
6/************************
a 為陣列名形參
low 為最小下標
high 為最大下標
*************************/
第一種方式:
voidquicksort(
int
*a,intlow,
inthigh)
else
if( a[j]
> a[low])
/* 從右到左找比a[low]小的元素*/
else
/* 若找到且滿足條件,則交換 */ }
temp
= a[low];
a[low]
= a[i];
a[i]
= temp;
if( i
> low )
/* 左邊待排數的進入遞迴排序 */
if( j
< high)
/* 右邊待排數的進入遞迴排序 */ }
第二種方式:
voidquicksort(
int
*a,intlow,
inthigh)
/* 有相等的數存在時,就會出錯 */
while( a[j]
> a[low]
&& i
< j)
/* 從右到左找比a[low]小的元素 */
if( i
< j )
/*若找到且滿足條件,則交換,必須加限制條件 i }
temp
= a[low];
a[low]
= a[i];
a[i]
= temp;
if( i
> low )
if( j
< high)
} 第三種方式:
voidquicksort(
int
*a,intlow,
inthigh)
if(i
< j)
while(a[i]
< temp
&& i
< j)
if(i
< j)
} a[i]
= temp;
if( i
> low )
if( j
< high)
} b:插入排序
①:直接插入排序 insert sort
voidinsertsort(
int
*a,intn)
a[j +
1] = temp; }
} ②:希爾排序 shell sort
voidshellsort(
int
*a,intn)
a[j +span]
= temp; }
}span
= span
/2; }
} c:選擇排序
①:直接選擇排序 select sort
重點:設定乙個flag標誌位,記錄每次迴圈中的最小(大)數的下標,迴圈完成時交換。
減少了交換次數。
voidselectsort(
int
*a,intn)
} if(flag
!= i)
//如果最小(數)不是每次迴圈的第乙個,則交換 }
}
演算法總結 棧 佇列 c語言實現
還是一道題typedef struct node1 d typedef struct node2 z d d1,d2 z z 初始化佇列d1和d2,此時兩人手中沒有牌 d1.head 0 d1.tail 0 d2.head 0 d2.tail 0 初始化棧z為空,最開始桌面上也沒有牌 z.top 0...
演算法總結 鍊錶 c語言實現
1.單鏈表的建立 頭插 尾插 2.迴圈鍊錶 include include typedef struct node g main 找到第乙個鍊錶的最後乙個節點 q head link while q link null q link head1 link 讓最後乙個節點的link指向head1的下乙...
c語言實現磁碟排程演算法 C語言實現洗牌演算法
首先看一道題目 有乙個大小為100的陣列,裡面的元素是從 1 到 100,隨機從陣列中選擇50個不重複數。用math.random 100,就可以拿到乙個 0 到 99 的隨機數,是不是重複50次就可以了?當然不是,假如,第一次隨機到5,第二次如果再一次隨機到5的話,要求是選擇不重複的數,所以要選出...