搜档网
当前位置:搜档网 › C语言 选择排序

C语言 选择排序

C语言 选择排序
C语言 选择排序

(一)基本思想

每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

选择排序是不稳定的排序方法。

n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:

①初始状态:无序区为R[1..n],有序区为空。

②第1趟排序

在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

……

③第i趟排序

第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(1≤i≤n-1)。该趟排序从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。

[编辑本段]排序过程

【示例】:

初始关键字[49 38 65 97 76 13 27 49]

第一趟排序后13 [38 65 97 76 49 27 49]

第二趟排序后13 27 [65 97 76 49 38 49]

第三趟排序后13 27 38 [97 76 49 65 49]

第四趟排序后13 27 38 49 [49 97 65 76]

第五趟排序后13 27 38 49 49 [97 65 76]

第六趟排序后13 27 38 49 49 65 [97 76]

第七趟排序后13 27 38 49 49 76 [97 76]

最后排序结果13 27 38 49 49 76 76 97

(二)C语言过程

void selectionSort(Type* arr,long len)

{

long i=0,j=0;/*iterator value*/

long maxPos;

assertF(arr!=NULL,"In InsertSort sort,arr is NULL\n");

for(i=len-1;i>=1;i--)

{

maxPos=i;

for(j=0;j

if(arr[maxPos]

if(maxPos!=i)swapArrData(arr,maxPos,i);

}

}

选择排序法的第一层循环从起始元素开始选到倒数第二个元素,主要是在每次进入的第二层循环之前,将外层循环的下标赋值给临时变量,接下来的第二层循环中,如果发现有比这个最小位置处的元素更小的元素,则将那个更小的元素的下标赋给临时变量,最后,在二层循环退出后,如果临时变量改变,则说明,有比当前外层循环位置更小的元素,需要将这两个元素交换.

(三)Pascal语言过程

procedure ssort(a:array of integer);{a为元素数组}

var

i,j,k,temp:integer;

for i:=n downto 2 do{共n-1轮选择}

begin

k:=1;

for j:=1 to i do

if a[j]>a[k] then k:=j;{第i轮,记录前i个数中最大的}

temp:=a[k];{把最大的与倒数第i个交换}

a[k]:=a[j];

a[j]:=temp;

end;

end;

(四)JA V A语言过程

public class Test {

public static int[] a = { 10, 32, 1, 9, 5, 7, 12, 0, 4, 3 }; // 预设数据数组public static void main(String args[]) {

int i; // 循环计数变量

int Index = a.length;// 数据索引变量

System.out.print("排序前: ");

for (i = 0; i < Index - 1; i++)

System.out.printf("%3s", a);

System.out.println("");

SelectSort(Index - 1); // 选择排序

// 排序后结果

System.out.print("排序后: ");

for (i = 0; i < Index - 1; i++)

System.out.printf("%3s", a);

System.out.println("");

}

public static void SelectSort(int Index) {

int i, j, k; // 循环计数变量

int MinV alue; // 最小值变量

int IndexMin; // 最小值索引变量

int Temp; // 暂存变量

for (i = 0; i < Index - 1; i++) {

MinValue = 32767; // 目前最小数值

IndexMin = 0; // 储存最小数值的索引值

for (j = i; j < Index; j++) {

if (a[j] < MinValue) // 找到最小值

{

MinValue = a[j]; // 储存最小值

IndexMin = j;

}

Temp = a; // 交换两数值

a = a;

a = Temp;

}

System.out.print("排序中: ");

for (k = 0; k < Index; k++)

System.out.printf("%3s", a[k]);

System.out.println("");

}

}

}

(五)visual basic语言过程

Private Sub switch(ByRef a, ByRef b)

Dim c As Integer

c = a

a = b

b = c

End Sub

-----------------------------------------------

Private Sub Command1_Click()

Dim i, j As Integer

Dim a As Variant

a = Array(12, 25, 58, 45, 33, 24) '举个例子

For i = 0 To UBound(a) - 1

For j = i + 1 To UBound(a)

If a(i) > a(j) Then

Call switch(a(i), a(j))

End If

Next j

Next i

For i = 0 To 5

Print a(i)

Next i

End Sub

(六)C#语言过程

public static void ssort(int[] list)

{

int i, j, min, temp;

for (i = 0; i < list.Length - 1; i++)

{

min = i;

for (j = i + 1; j < list.Length; j++)

{

if (list[j] < list[min])

min = j;

}

temp = list[i];

list[i] = list[min];

list[min] = temp;

//调用排序过程

static void Main(string[] args)

{

int[] arrlist = new int[] { 49, 38, 65, 97, 76, 13, 27, 49 };

ssort(arrlist);

for (int n = 0; n < arrlist.Length; n++)

{

Console.Write("{0}",arrlist[n]+" "); }

Console.WriteLine();

}

相关主题